在我的测试盒上我有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>
答案 0 :(得分:5)
您将苹果与橙子进行比较:自定义标签和功能不是可互换的概念。虽然它们都可以被编码以实现相同的目的,但在使用功能合适的自定义标签时通常是一个糟糕的决定;同样也是一个使用自定义标签更适合的功能的不良选择。
函数用于数据操作;自定义标签用于文本/内容操作。因此,您的功能属于您的业务逻辑,您的自定义标记属于您的显示逻辑。
两者都有自己的位置。
如果你循环1000次并且每次迭代调用一些功能200次......这听起来不像你应该使用自定义标签(它不是为输出准备文本,是吗?);它听起来像数据处理,所以应该由函数处理(希望那些被适当地封装在对象中的......)