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