【问题标题】:Events is SFML. Switch statement VS if statement事件是 SFML。 Switch 语句 VS if 语句
【发布时间】:2016-02-15 18:11:46
【问题描述】:

我有一些这样的代码:

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 中哪个更快并且对其他人来说更易读?

【问题讨论】:

  • 启用现代编译器和优化后,它们可能会产生相同的机器代码(因此具有相同的速度)。
  • @Cornstalks 我正在使用g++。我认为它是您所说的现代编译器之一。
  • 但是你需要g++ -O2 -mcpu=native
  • @BasileStarynkevitch 谢谢,我会超越它。
  • 下一次,相信你的编译器,甚至不要花时间问这个!

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


【解决方案1】:

这不是 SFML 的问题,同样的问题也可能出现在其他类型的类似代码中(例如,大多数事件循环、有限状态自动机、bytecode 解释器;另请参阅 threaded code )。

关于性能,原则上,switch通常稍微快一些,但您应该进行基准测试(有些编译器可能会在optimize@987654327 序列@ 相当于 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 编译和链接

(实际上,在这种情况下,可读性是你唯一关心的事情)

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

【讨论】:

  • 感谢您的出色回答!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多