当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 证明coldfusion函数不必要地缓冲output = true

来源:互联网 收集:自由互联 发布时间:2021-06-22
我听说如果你没有在ColdFusion函数上指定output =“false”,那么会发生不必要的缓冲,这可能会影响性能.所以我想进行一项测试,看看能不能证明这一点.我的测试如下.我看到output =“true”或
我听说如果你没有在ColdFusion函数上指定output =“false”,那么会发生不必要的缓冲,这可能会影响性能.所以我想进行一项测试,看看能不能证明这一点.我的测试如下.我看到output =“true”或output =“false”之间没有任何区别.

所以我的问题是:如果我在大循环中使用了函数,我不必担心这个设置吗?或者我没有正确测试?

我的测试是将相同的功能调用1,000,000次.我使用output =“false”运行了3次,使用output =“true”运行了3次.所有6项测试都在20-21秒完成.

测试代码:

<cffunction name="good" output="false" returntype="Numeric" access="private">
    <cfargument name="numIn" type="numeric" required="true">
    <cfset var x = 0>
    <cfset x = arguments.numIn + 1>
    <cfreturn x>
</cffunction>

<cffunction name="bad" output="true" returntype="Numeric" access="private">
    <cfargument name="numIn" type="numeric" required="true">
    <cfset var x = 0>
    <cfset x = arguments.numIn + 1>
    <cfreturn x>
</cffunction>

<cfset loopNum = 1000000>

<cfset x = 0>
<cfoutput>
    x = #x#<br>
    Running bad function #loopNum# times...<br>
</cfoutput>
<cfset tBegin = GetTickCount()>
<cfloop from="1" to="#loopNum#" index="i">
    <cfset x = bad(i)>
</cfloop>
<cfset tEnd = GetTickCount()>
<cfset scriptTime = (tEnd - tBegin)>
<cfoutput>
    x = #x#<br>
    Time to complete: #scriptTime#<br>
</cfoutput>

<!---
<cfset x = 0>
<cfoutput>
    x = #x#<br>
    Running good function #loopNum# times...<br>
</cfoutput>
<cfset tBegin = GetTickCount()>
<cfloop from="1" to="#loopNum#" index="i">
    <cfset x = good(i)>
</cfloop>
<cfset tEnd = GetTickCount()>
<cfset scriptTime = (tEnd - tBegin)>
<cfoutput>
    x = #x#<br>
    Time to complete: #scriptTime#<br>
</cfoutput>
--->
我同意最好在你的函数中包含output =“false”,除非你有一个非常具体和非常好的理由(例如,在某些Application.cfc方法中,例如onRequest()).但我从来没有听到有人说这个原因与性能有关,无论是处理器利用率还是内存消耗.我维护它的主要原因是你在运行时没有突然意外的错误(由同样不必要的缓冲引起).

这是一个简单的例子:

<cffunction name="getFlag" output="true">
    <cfreturn true />
</cffunction>

<cfif getFlag()><p>Hello World!</p></cfif>

<cfxml variable="doc"><cfoutput><root flag="#getFlag()#" /></cfoutput></cfxml>

<cfif doc.root.xmlAttributes.flag><p>Hello world!</p></cfif>

你可以写这样的东西,认为一切都应该没问题,因为第一个< cfif>测试工作正常,您可以转储出xml文档,从< cfdump>的输出看起来没问题.然后您将收到此示例创建的错误消息:

cannot convert the value " true" to a boolean

因为函数中的空白区域流入XML属性,而CF允许您将字符串“true”视为布尔值,因此不会将字符串转换为“true”.然后就像我们之前的许多人一样,你可能会花很长时间敲打你的脑袋,试图找出当你的函数的返回值中没有额外空间时,为什么XML文档中有额外的空格.在CF5中引入自定义功能时,它发生在我身上.

网友评论