【发布时间】:2018-01-24 06:00:01
【问题描述】:
我尝试比较switch 语句和查找表的性能,如下所示。
这是使用switch语句的代码
#include <stdio.h>
int main()
{
int n = 3;
for (long i = 0; i < 10000000; ++i) {
switch (n) {
case 0:
printf("Alpha");
break;
case 1:
printf("Beta");
break;
case 2:
printf("Gamma");
break;
case 3:
printf("Delta");
break;
default:
break;
}
}
return 0;
}
下面是使用查找表的代码:
#include <stdio.h>
static char const * const Greek[4] = {
"Alpha",
"Beta",
"Gamma",
"Delta"
};
int main()
{
int n = 3;
for (long i = 0; i < 10000000; ++i) {
if (n >= 0 && n < 4) {
printf(Greek[n]);
}
}
return 0;
}
我在 ubuntu 14.04 上运行两个程序,gcc 版本 4.8.4,使用 perf 版本 4.4.13 来分析性能。结果:
- Switch 语句:6.764077822 秒
- 查找表:6.665140483 秒
我不知道为什么 Switch 语句的运行速度比查找表慢。正如我所知,使用跳转表的 Switch 语句,我认为它应该比我的程序中的查找表运行得更快(它有额外的 if 语句)。
【问题讨论】:
-
您的时间包括调用
printf,这可能会导致结果不准确。 -
你应该看看生成的汇编代码。
-
如果你开启了优化,
switch和if都将被一个好的优化编译器优化掉。 -
请注意,如果您用
-O3编译它们是相同的,编译器会识别n=3并删除与其他情况相关的所有内容(包括if和switch)。 -
使用godbolt.org 编译器资源管理器,它会立即显示生成的汇编代码。您可以选择不同的编译器,并且可以指定所有编译标志。还要将
n = 3更改为n = rand(),这样优化器就不会优化掉大部分代码。
标签: c++ c performance switch-statement lookup-tables