我知道这个问题可能有点学术性,但我只是想在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>
Run Code Online (Sandbox Code Playgroud)
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>" );
}
Run Code Online (Sandbox Code Playgroud)
只是一个乐趣 - 当键存在时,isNull()比structKeyExists()更快.但是,当变量不存在时,structKeyExists()会更快.
这不是你“为什么?”的答案。但不同的“为什么?”。
你为什么在乎?我的意思是,以现实世界的方式。在 StackOverflow 上问就足够了。
我认为这是一个很好的问题(也是让我着迷的问题),但我在博客上讨论这类事情,这是我的爱好。
然而,从日常工作的角度来看,在我开始关心此类事情之前,我会评估性能差异有多大?如果出于论证的目的,您需要循环代码 1000000 次以将其放大到足以看到有意义的结果,那么使用请求范围的速度比使用传入引用 (1000ms) 慢两倍(例如 2000 毫秒),那么它是100% 的差异并不重要;事实上,每次迭代的差异仅为 0.001 毫秒:也就是说,这根本不重要。
我特意发布这个答案,不一定是为了你,而是为了后来的人:要小心微观/过早优化。这类事情不太可能是您真正需要优化的任何事情的原因。
与此同时...您是否在 Railo 上运行了测试以查看是否存在任何差异?
如果您可以将所有发现写在博客上,那就太酷了!
归档时间: |
|
查看次数: |
185 次 |
最近记录: |