c++ - 事件是 SFML。 switch 语句 VS if 语句

标签 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 中速度更快并且对其他人来说更具可读性?

最佳答案

这不是 SFML 的问题,其他类型的类似代码(例如大多数事件循环、有限状态自动机、bytecode 解释器;另请阅读 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 进行编译,并可能将 -O2 替换为 -O3(并且如果您非常关心性能,甚至可以使用 g++ -flto -O3 -mcpu=native 编译并链接)

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

如果您想了解编译器如何优化以及“为什么”优化,请考虑将 -O2 标志添加到 -fverbose-asm -S(然后查看生成的.s 文件)甚至用 -fdump-tree-all 编译(你会得到 数百 的编译器转储文件,对应于各种优化通过一些优化开关(例如 -O2-O3)传入 GCC ...)。

关于c++ - 事件是 SFML。 switch 语句 VS if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416244/

相关文章:

c++ - 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?

c++ - 没有显式定义的构造函数时,为什么可以创建对象?

python - 如何避免使用全局变量?

PHP:2 个开关不能很好地相互交互

c# - LINQ:如何向 LINQ 查询添加多个变量?

c++ - OpenGL:动态改变纹理坐标

c++ - 找不到文件 : mainwindow. obj

java - 为什么它会跳过我的 if-else 语句的 else 部分?

java - 基本的银行程序无限地执行 do 循环。我究竟做错了什么?

c# - 如何正确使用C# 8.0 switch case