【问题标题】:prove that coldfusion functions unnecessarily buffer with output=true证明冷融合功能不必要地缓冲输出=真
【发布时间】: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


【解决方案1】:

我同意在函数中始终包含 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>

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

cannot convert the value " true" to a boolean 

因为函数中的空格会渗入 XML 属性,而 CF 允许您将字符串“true”视为布尔值,但它不会转换字符串“true”。然后就像我们之前的许多人一样,您可能会花很长时间敲打自己的脑袋,试图弄清楚为什么在您的函数的返回值中没有多余的空格时,您的 XML 文档中有多余的空格。在 CF5 中引入自定义函数时,我曾经遇到过这种情况。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多