哪个片段执行得更快/生成更少的代码行? (C ++ / JavaScript)

时间:2011-03-18 12:27:11

标签: javascript c++

其中哪一个在速度方面更有效率(生成的代码行数)。

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 ++可能会优化以获得几乎相同的结果。

感谢您的所有输入。

7 个答案:

答案 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.ya.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();

当然,如果不知道do1do2mem实际上是什么,就很难提供更多建议。

答案 5 :(得分:1)

JavaScript中的局部变量更快,因为The further into the chain, the slower the resolution

答案 6 :(得分:0)

差异绝对微不足道,而且可以忽略不计。