经过很多尝试,我发现使用该函数会产生额外开销,而不是直接将逻辑放在循环中-我的问题是:为什么?!
所涉及的函数非常简单,它接受一个字符串参数,并将其传递给包含大约15个选项的switch / case块,返回结果字符串。我在各个地方放了一堆计时器,并发现很多(不是全部)时间这个函数调用需要花费0到200毫秒才能运行...但是如果我将完全相同的代码内联,它在每次迭代上都为0。
所有这些都指向我对对象实例化的理解存在根本性问题,我希望得到一些澄清。
我一直以为,如果我在页面顶部实例化组件,或者确实在应用程序或会话等持久范围中实例化它,那么它将被放置在内存中,并且对该组件内的函数的后续调用将非常快速。然而,似乎调用这些函数存在开销,虽然我们只谈论几毫秒,但当您必须执行50,000次时,它很快就会累加。
此外,这样做似乎会消耗资源。我对JVM使用内存的方式并不特别了解,我已经研究过它并尝试了设置等操作,但这是一个令人不知所措的话题,特别是对于没有Java开发经验的人来说。当调用内联代码时,似乎有时ColdFusion服务会崩溃,并且请求永远不会结束。其他时候它确实会完成,但速度太慢了。这表明只有在服务器有足够资源处理请求时,请求才能完成-因此方法调用本身正在消耗内存... (?)
如果确实调用方法有附加开销,那么我就有大问题了。将所有代码都内联显然不可行(虽然相关功能很简单,但我还需要使用许多其他功能),而且这样做与作为开发人员的信念完全不符!!
因此,任何帮助都将不胜感激。
仅为清楚起见,并且我确定有人会要求它,这里是相关代码:
编辑:如建议所述,我已更改代码以使用结构查找而不是CFSwitch-下面是修改后的代码供参考,但是在底部的pastebin链接中还有一个测试应用程序。
init方法内部:
<cfset Variables.VehicleCategories = {
'T1' : 'Beetle'
, 'T1C' : 'Beetle Cabrio'
, 'T2' : 'Type 2 Split'
, 'T2B' : 'Type 2 Bay'
, 'T25' : 'Type 25'
, 'Ghia' : 'Karmann Ghia'
, 'T3' : 'Type 3'
, 'G1' : 'MK1 Golf'
, 'G1C' : 'MK1 Golf Cabriolet'
, 'CADDY' : 'MK1 Caddy'
, 'G2' : 'MK2 Golf'
, 'SC1' : 'MK1/2 Scirocco'
, 'T4' : 'T4'
, 'CO' : 'Corrado'
, 'MISC' : 'MISC'
} />
被调用的函数:
<cffunction name="getCategory" returntype="string" output="false">
<cfargument name="vehicleID" required="true" type="string" hint="Vehicle type" />
<cfscript>
if (structKeyExists(Variables.VehicleCategories, Arguments.VehicleID)) {
return Variables.VehicleCategories[Arguments.VehicleID];
}
else {
return 'Base SKUs';
}
</cfscript>
</cffunction>
按照要求,我已经创建了一个测试应用程序来复制这个问题:
http://pastebin.com/KE2kUwEf - Application.cfc
http://pastebin.com/X8ZjL7D7 - TestCom.cfc(放在Web根目录外的'com'文件夹中)
http://pastebin.com/n8hBLrfd - index.cfm
output=false
!这会增加开销,可能会减慢速度。 - Peter Boughton