【发布时间】:2014-04-24 13:09:11
【问题描述】:
我听说如果您不在 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>
--->
【问题讨论】:
-
如果你有办法,你可能想看看 RAM 使用情况。
-
我不知道缓冲,但如果你使用 returntype="string",它会添加空格和可能的回车。因此,如果您希望返回“Hello”,有时会得到“Hello”或“\nHello”(其中 \n 表示回车。
-
澄清一下,当I wrote“不必要的缓冲”时,我专门指的是向输出缓冲区添加空格。证明这种情况发生是微不足道的,而且 - 特别是没有空格压缩和/或 gzip 压缩请求 - 这肯定是一个问题。
-
在您的示例中,每个函数迭代的 9..26 个空格将累积到少于 10MB 的内存,这在您显示的图表中并不是一个重要的数量(看起来更随机变化大于此),但显然,当您有更长的嵌套函数和多个循环等时,它可以加起来并成为一个重要因素(即使不考虑 HTTP 端)。当然,不输出空格总是比添加它然后删除它更快(即使这种差异很小)。
标签: performance memory coldfusion