范围访问CFM与CFC的性能

时间:2014-07-17 14:09:18

标签: 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>

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()会更快。

1 个答案:

答案 0 :(得分:1)

这不是你&#34;为什么的答案?&#34;但是有一个不同的&#34;为什么?&#34;。

为什么要关心?我的意思是,以现实世界的方式。足以在StackOverflow上询问。

我认为这是一个很好的问题(以及那些令我着迷的东西),但我在博客上谈论这类事情,这是我的爱好。

然而,从一天工作的角度来看,在我开始关注任何这类内容之前,我是否正在评估性能差异有多大?如果为了论证的缘故,你需要将你的代码循环1000000次以放大它以便看到有意义的结果,使用请求范围比使用传入的引用慢两倍(比如2000ms)( 1000ms),重要的不是100%的差异;事实上,每次迭代的差异只有0.001毫秒:即,它根本不重要。

我指出这个答案不一定适合你,但对于后来的人来说:要谨慎对待微/早熟优化。这种事情很可能不是你实际需要优化的原因。

与此同时......你有没有在Railo上进行测试,看看是否有任何差异?

如果你可以在博客上发布你的所有发现,那就太酷了!