我听说如果你没有在ColdFusion函数上指定output =“false”,那么会发生不必要的缓冲,这可能会影响性能.所以我想进行一项测试,看看能不能证明这一点.我的测试如下.我看到output =“true”或
所以我的问题是:如果我在大循环中使用了函数,我不必担心这个设置吗?或者我没有正确测试?
我的测试是将相同的功能调用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中引入自定义功能时,它发生在我身上.