我知道这个问题可能有点学术性,但我只是想理解ColdFusion中的这种行为。
在CFM上访问REQUEST作用域比在方法中访问REQUEST作用域所需的时间更短。据我观察,查看我的.class文件时唯一的区别是,在方法内部,它必须引用CFPage参数来访问structKeyExists()方法以检查REQUEST范围。此外,另一个奇怪的现象是,在CFC的方法中访问THIS作用域比访问VARIABLES作用域更快。
有人知道这是为什么吗?
index.cfm
在CFM上访问REQUEST作用域比在方法中访问REQUEST作用域所需的时间更短。据我观察,查看我的.class文件时唯一的区别是,在方法内部,它必须引用CFPage参数来访问structKeyExists()方法以检查REQUEST范围。此外,另一个奇怪的现象是,在CFC的方法中访问THIS作用域比访问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()更快。