我理解这个问题可能有点学术性,但我只是想在ColdFusion中理解这种行为。
在CFM上访问REQUEST范围时,比在方法中访问REQUEST范围花费的时间更少。在我查看我的.class文件时,唯一的区别是,在方法内部,它必须引用CFPage参数来访问structKeyExists()方法以检查REQUEST范围。另外,另一个奇怪的是,访问THIS范围比访问CFC中的方法中的VARIABLES范围更快。
有谁知道为什么会这样?
index.cfm
<cfscript>
tests = new tests();
request.test = {
"foo":[1]
};
iterations = 10000;
starttime = getTickCount();
for( i=1; i<=iterations; i++){
if( structKeyExists( request, "test" ) ){
request.test.foo[1];
}
}
writeoutput( "REQUEST scope access on CFM: " & getTickCount()-starttime & "<br>" );
tests.test( iterations ) ;
</cfscript>
Test.cfc
component{
function test( iterations ) {
// test variables
variables.testvar = {foo : [1]};
this.testvar = {foo : [1]};
var startTime = getTickCount();
for( var i=1; i<=iterations; i++){
if( structKeyExists( request, "test" ) ){
request.test.foo[1];
}
}
writeOutput( "REQUEST scope access in method: " & getTickCount()-startTime & "<br>" );
startTime = getTickCount();
for( i=1; i<=iterations; i++ ){
if( structKeyExists( variables, "testvar" ) ){
variables.testvar.foo[1];
}
}
writeOutput( "VARIABLES scope access in method: " & getTickCount()-startTime & "<br>" );
startTime = getTickCount();
for( i=1; i<=iterations; i++){
if(structKeyExists(this, "testvar" ) ){
this.testvar.foo[1];
}
}
writeOutput( "THIS scope access in method: " & getTickCount()-startTime & "<br>" );
}
只是一个乐趣 - 当键存在时,isNull()比structKeyExists()更快。但是,当变量不存在时,structKeyExists()会更快。
答案 0 :(得分:1)
这不是你&#34;为什么的答案?&#34;但是有一个不同的&#34;为什么?&#34;。
为什么要关心?我的意思是,以现实世界的方式。足以在StackOverflow上询问。
我认为这是一个很好的问题(以及那些令我着迷的东西),但我在博客上谈论这类事情,这是我的爱好。
然而,从一天工作的角度来看,在我开始关注任何这类内容之前,我是否正在评估性能差异有多大?如果为了论证的缘故,你需要将你的代码循环1000000次以放大它以便看到有意义的结果,使用请求范围比使用传入的引用慢两倍(比如2000ms)( 1000ms),重要的不是100%的差异;事实上,每次迭代的差异只有0.001毫秒:即,它根本不重要。
我指出这个答案不一定适合你,但对于后来的人来说:要谨慎对待微/早熟优化。这种事情很可能不是你实际需要优化的原因。
与此同时......你有没有在Railo上进行测试,看看是否有任何差异?
如果你可以在博客上发布你的所有发现,那就太酷了!