事件是SFML。切换语句VS if语句

时间:2016-02-15 18:11:47

标签: c++ if-statement switch-statement

我有一些像这样的代码:

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哪个更快,其他人更可读?

2 个答案:

答案 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)

开关的情况。它更易读,更易于理解。