范围访问CFM与CFC的性能

J.T*_*.T. 5 coldfusion

我知道这个问题可能有点学术性,但我只是想在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()会更快.

Ada*_*ron 1

这不是你“为什么?”的答案。但不同的“为什么?”。

你为什么在乎?我的意思是,以现实世界的方式。在 StackOverflow 上问就足够了。

我认为这是一个很好的问题(也是让我着迷的问题),但我在博客上讨论这类事情,这是我的爱好。

然而,从日常工作的角度来看,在我开始关心此类事情之前,我会评估性能差异有多大?如果出于论证的目的,您需要循环代码 1000000 次以将其放大到足以看到有意义的结果,那么使用请求范围的速度比使用传入引用 (1000ms) 慢两倍(例如 2000 毫秒),那么它是100% 的差异并不重要;事实上,每次迭代的差异仅为 0.001 毫秒:也就是说,这根本不重要。

我特意发布这个答案,不一定是为了你,而是为了后来的人:要小心微观/过早优化。这类事情不太可能是您真正需要优化的任何事情的原因。

与此同时...您是否在 Railo 上运行了测试以查看是否存在任何差异?

如果您可以将所有发现写在博客上,那就太酷了!