我听说如果你没有在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>
--->
答案 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中引入自定义功能时,它发生在我身上。 ;)