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