C ++中的性能比较(正常函数调用与for_each + mem_fun对比lambda表达式)

时间:2010-12-06 12:41:53

标签: c++ lambda c++11 visual-c++-2010

这些片段中哪一个(性能最好)?

1)

for(list<Enemy*>::iterator iter = enemies.begin(); iter != enemies.end(); iter ++)
   (*iter)->prepare(time_elapsed);

2)

for_each(enemies.begin(), enemies.end(), [time_elapsed] (Enemy *e) {e->prepare(time_elapsed);});

3)

for_each(enemies.begin(), enemies.end(), bind2nd(mem_fun1<void, Enemy, GLfloat>(&Enemy::prepare), time_elapsed));

4 个答案:

答案 0 :(得分:1)

Lambda是最快的解决方案。参与基于堆栈的变量涉及特殊优化。另外,在C ++ 0x中,它们比任何绑定内容都更加灵活,并且第一个循环也具有明显的缺点。 Lambdas在各个方面都是winrar。

然而,我正在认真思考微优化,除非这是一个非常真实的内循环,运行数十亿次。

答案 1 :(得分:0)

2和3基本相同。 1可能更快,因为它每次迭代执行一次函数调用,而2和3每次迭代执行两次函数调用。然后,一些函数调用可能会被内联。真正告诉的唯一方法是衡量。

此外,由于您正在抛出lambda函数(C ++ 0x),为什么不在测量中添加基于范围的for循环:

for (var iter : enemies) { iter->prepare(time_lapsed); }

假设您的编译器支持它们,当然。

编辑:我刚刚注意到了vc ++ 2010标签。不幸的是,你的编译器还不支持它们: - (

答案 2 :(得分:0)

我在没有编译器优化的情况下进行了测量:

2)和3)具有几乎相同的运行时间,而1)慢10倍。我还添加了一个4)

for each (Enemy* e in enemies)
      e->prepare(time_elapsed);

对Visual C ++ 2010有效,应该与Ferruccio的相同:

for (var iter : enemies) { iter->prepare(time_elapsed); }

4)也几乎和2)和3)一样快。

-O2都具有几乎相同的运行时间。

答案 3 :(得分:0)

答案是“在测量目前不够快”之前,这一点并不重要。这个问题基本上是过早的优化。直到它太慢并且你已经测量将循环视为瓶颈,你的首要任务是使用代码来传达你想要做的事情。最清晰的方式。首先编写好的代码,稍后进行优化。