其中哪一个在速度方面更有效率(生成的代码行数)。
var x=obj.mem;
x.do1();
x.do2();
或
obj.mem.do1();
obj.mem.do2();
我只是用通用模式写的。具体来说,如果我必须访问成员(或成员的成员),最好将公共部分分配给变量然后使用该变量或直接调用它,如第二种情况所示。
我主要关注的是C ++和JavaScript(如果重要的话)。 谢谢。
编辑 - > PS.I没有问一个共同的答案。我知道Javascript是一种解释器语言,而C ++是基于编译器的。我对JavaScript的一点知识都是自学,我们在学校学习了2年C ++(也是Turbo C ++),剩下的就是自学。所以,请原谅我的困惑。我期待一般结果,假设构造是有效的并考虑任何可能的变化。无论如何,我的主要疑虑被清除了。感谢。
结论:JS使用局部变量更快(虽然可以忽略不计),C ++可能会优化以获得几乎相同的结果。
感谢您的所有输入。
答案 0 :(得分:7)
在JavaScript中,第一个更快。你会认为应该没有太大的区别,但我在开发Dreamweaver扩展(他们使用JavaScript)时遇到了这个问题,并且存在巨大的差异。
我建议你避免使用长链。
基准:
var x = {y:{z:null}};
var start = (new Date).getTime();
for(var i=0;i<1000000;i++){
x.y.z = i;
}
alert((new Date).getTime()-start);
VS
var x = {y:{z:null}};
var start = (new Date).getTime();
var q = x.y;
for(var i=0;i<1000000;i++){
q.z = i;
}
alert((new Date).getTime()-start);
第二个在我的Firefox中快10%左右。但请记住,这是一个极简主义的场景。如果你使用更大的物体和更深的水平,差异可能会上升。
当然可以:
var x = {a:{b:{c:{d:{y:{z:null}}}}}};
var start = (new Date).getTime();
for(var i=0;i<1000000;i++){
x.a.b.c.d.y.z = i;
}
alert((new Date).getTime()-start);
VS
var x = {a:{b:{c:{d:{y:{z:null}}}}}};
var start = (new Date).getTime();
var q = x.a.b.c.d.y;
for(var i=0;i<1000000;i++){
q.z = i;
}
alert((new Date).getTime()-start);
30%是否足以让它不可忽视?
的问候,
阿林
答案 1 :(得分:4)
在C ++中,打开编译器优化器后,它们的表现应该相同(至少平均)。
答案 2 :(得分:2)
至少在JavaScript中,通过将属性分配给局部变量,可以避免在潜在的高(如全局)范围内查找obj
,这可能是“慢”。
JS的经验法则是:如果必须多次访问非本地对象,请将其设置为本地对象。
嵌套属性相同。如果可能,最好将a.b.c.d.x
分配给变量,而不是访问a.b.c.d.y
和a.b.c.d
。
如果您对整体表现感兴趣,请查看书籍High Performance JavaScript。
答案 3 :(得分:2)
在C ++中,任何一个不太优秀的编译器都会优化差异。
在Javascript中差异应该是可以忽略的。不要在这样的东西上浪费你的时间,除非你正在构建一个像jQuery这样的数百万人使用的库。
修改强>
显然有些人不理解我在上面的论证中对可忽略的含义。是的,您可以对这些内容进行基准测试,并发现创建局部变量的速度要快30%。但是1.30 * 0.003
毫秒是不明显,因此可以忽略,除非它执行了数百万次,例如在库中。
答案 4 :(得分:2)
根据x
的类型,第一个表单甚至可能无法编译(如果类型没有复制构造函数)。
我可能会选择:
the_type& x = obj.mem;
x.do1();
x.do2();
请注意,从外部访问成员是一个非常糟糕的主意。它违背了面向对象编程的基本原则之一:封装。这是你真正应该做的:
obj.do_stuff();
当然,如果不知道do1
,do2
和mem
实际上是什么,就很难提供更多建议。
答案 5 :(得分:1)
JavaScript中的局部变量更快,因为The further into the chain, the slower the resolution。
答案 6 :(得分:0)
差异绝对微不足道,而且可以忽略不计。