事件是 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
通常 稍微 更快,但您应该进行基准测试(和一些编译器可能 optimize 将 if
的序列转换为 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
)。
我有一些这样的代码:
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
通常 稍微 更快,但您应该进行基准测试(和一些编译器可能 optimize 将 if
的序列转换为 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
)。