证明coldfusion函数不必要地缓冲,输出= true

时间:2014-03-18 17:13:23

标签: performance memory coldfusion

我听说如果你没有在ColdFusion函数上指定output="false",就会发生不必要的缓冲,这可能会影响性能。所以我想进行一项测试,看看能不能证明这一点。我的测试如下。我发现output="true"output="false"之间没有任何区别。

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

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

enter image description here

测试代码:

<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>
--->

1 个答案:

答案 0 :(得分:3)

我同意最佳做法是始终包含output =&#34; false&#34;在你的函数中,除非你有一个非常具体和非常好的理由(例如,在某些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则允许你处理字符串&#34; true&#34;作为一个布尔值,它不会转换字符串&#34;真&#34 ;.然后就像我们之前的许多人一样,你可能会花很长时间敲打你的脑袋,在你的函数的返回值中没有额外的空间时,试图找出XML文档中为什么会有额外的空格。 。在CF5中引入自定义功能时,它发生在我身上。 ;)