coldfusion性能比较:自定义标签与功能

时间:2014-03-20 20:52:19

标签: performance function memory coldfusion custom-tag

在我的测试盒上我有ColdFusion 10并且只分配了1gig:“最大JVM堆大小(以MB为单位)= 1024”。

我有一个循环大约1000次的过程。每个循环迭代调用自定义标记〜200次。所以大约有200,000个电话。这个过程永远不会结束,我最终耗尽了记忆。我确定这是我在标签里面做的问题,而不是标签本身。但我想证明这一点。我运行了这个测试,看起来ColdFusion函数比2.7secs更快14.6secs。测试只增加一个数字。

我的问题是:这看起来是一个有效的测试吗?如果函数速度快得多,那么只要可能的话,使用它们而不是自定义标记是一个经验法则吗?

测试结果:

x = 0
Running good customtag 1000000 times...
x = 1000000
Time to complete: 14627

x = 0
Running good function 1000000 times...
x = 1000001
Time to complete: 2793

good.cfm自定义标记:

<cfparam name="ATTRIBUTES.x" type="numeric" default="0">

<cfif thisTag.ExecutionMode eq "end">
    <cfset request.x = ATTRIBUTES.x+1>
    <cfset thistag.generatedcontent = "">
</cfif>

测试代码:

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

<cfset loopNum = 1000000>
<cfset request.x = 0>

<cfoutput>
    x = #request.x#<br>
    Running good customtag #loopNum# times...<br>
</cfoutput>
<cfset tBegin = GetTickCount()>
<cfloop from="1" to="#loopNum#" index="i">
    <cf_good x="#request.x#"></cf_good>
</cfloop>
<cfset tEnd = GetTickCount()>
<cfset scriptTime = (tEnd - tBegin)>
<cfoutput>
    x = #request.x#<br>
    Time to complete: #scriptTime#<br>
</cfoutput>

<cfset request.x = 0>
<cfoutput>
    x = #request.x#<br>
    Running good function #loopNum# times...<br>
</cfoutput>
<cfset tBegin = GetTickCount()>
<cfloop from="1" to="#loopNum#" index="i">
    <cfset request.x = good(i)>
</cfloop>
<cfset tEnd = GetTickCount()>
<cfset scriptTime = (tEnd - tBegin)>
<cfoutput>
    x = #request.x#<br>
    Time to complete: #scriptTime#<br>
</cfoutput>

1 个答案:

答案 0 :(得分:5)

您将苹果与橙子进行比较:自定义标签和功能不是可互换的概念。虽然它们都可以被编码以实现相同的目的,但在使用功能合适的自定义标签时通常是一个糟糕的决定;同样也是一个使用自定义标签更适合的功能的不良选择。

函数用于数据操作;自定义标签用于文本/内容操作。因此,您的功能属于您的业务逻辑,您的自定义标记属于您的显示逻辑。

两者都有自己的位置。

如果你循环1000次并且每次迭代调用一些功能200次......这听起来不像你应该使用自定义标签(它不是为输出准备文本,是吗?);它听起来像数据处理,所以应该由函数处理(希望那些被适当地封装在对象中的......)