0

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

我有一个循环大约 1000 次的过程。每次循环迭代调用一个自定义标签约 200 次。所以总共有大约 200,000 个电话。这个过程永远不会结束,我最终内存不足。我确定这是我在标签内所做的事情,而不是标签本身。但我想证明这一点。我运行了这个测试,似乎 ColdFusion 函数2.7secs14.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>
4

1 回答 1

5

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

函数用于数据操作;自定义标签用于文本/内容操作。所以你的函数属于你的业务逻辑,你的自定义标签属于你的显示逻辑。

两者都有自己的位置。

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

于 2014-03-20T22:07:12.437 回答