事件是 SFML。 switch 语句 VS if 语句

Events is SFML. Switch statement VS if 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 中更快,对其他人来说更易读?

开关盒。它更具可读性和可优化性。

这不是 SFML 的问题,其他类型的类似代码(例如大多数事件循环、有限状态自动机、bytecode interpreters; read also about threaded code)可能会出现同样的问题.

关于性能,原则上,switch 通常 稍微 更快,但您应该进行基准测试(和一些编译器可能 optimizeif 的序列转换为 switch 的等价物,反之亦然)。在您的情况下,这并不重要(因为大多数时候您的应用程序会等待 window.pollEvent(event) ....中的事件。

假设没有进行大量优化,我想一些罕见的开关可能 稍微 慢,因为例如L1 I-cache 已满,因为热代码太大,等等......但这种情况很不寻常。

如果您好奇,请阅读这篇关于开关优化的 A Superoptimizer Analysis of Multiway Branch Code Generation 论文(作者 R.Sayle)。

关于可读性,switch 也更具可读性。

可读性参数 似乎与我最相关; 将微优化留给编译器,它们做得很好。当然,不要忘记用 g++ -Wall -O2 -mcpu=native 编译,也许用 -O3 替换 -O2 (甚至可能编译 和 link g++ -flto -O3 -mcpu=native 如果你非常关心性能)

(实际上,在这种情况下,可读性是唯一对您重要的事情)

如果您想了解 "why" 编译器如何优化,请考虑将 -O2 标志添加到 -fverbose-asm -S(然后查看生成的 .s 文件)或甚至使用 -fdump-tree-all 进行编译(您将获得 数百个 的编译器转储文件,对应于 GCC... 中的各种优化传递)以及一些优化开关(例如-O2-O3)。