我有一些像这样的代码:
while(window.pollEvent(event) {
//checking events...
}
我的问题是,我应该使用switch语句:
switch(event.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
//...
break;
}
或if-else声明:
if(event.type == sf::Event::Closed)
window.close();
else if(event.type == sf::Event::KeyPressed)
//...
SFML哪个更快,其他人更可读?
答案 0 :(得分:5)
这不是 SFML 的问题,同样的问题可能出现在其他类似的代码中(例如,大多数事件循环,有限状态自动机,bytecode解释器;同时阅读{ {3}})。
关于性能,原则上switch
经常 稍微更快,但你应该进行基准测试(有些编译器可能threaded code a if
的序列为switch
的等价物,反之亦然。在你的情况下,它应该不重要(因为大多数时候你的应用程序将等待来处理window.pollEvent(event)
....中的事件。)
假设没有发生重大优化,我会想象一些罕见的开关可能略微更慢,因为例如L1 I-cache已满,因为热代码太大等等......但这种情况很不寻常。
如果您感到好奇,请阅读这篇关于开关优化的optimize论文(由R.Sayle撰写)。
关于可读性,switch
也更具可读性。
可读性论证似乎与我最相关; 将微优化保留给编译器,它们做得很好。当然,不要忘记使用g++ -Wall -O2 -mcpu=native
进行编译,也许可以用-O2
替换-O3
(甚至可以编译并使用g++ -flto -O3 -mcpu=native
链接你非常关心表现)
(实际上,在这种情况下,可读性是唯一对您而言重要的事情)
如果您想了解编译器优化的方式和“原因”,请考虑添加-O2
标记-fverbose-asm -S
(然后查看生成的.s
文件)或甚至编译{ {1}}(您将获得数百的编译器转储文件,对应于A Superoptimizer Analysis of Multiway Branch Code Generation中的各种优化传递...)和一些优化开关(例如-fdump-tree-all
或{ {1}})。
答案 1 :(得分:1)
开关的情况。它更易读,更易于理解。