我试图比较switch
语句和查找表的性能,如下所示。C++: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来分析性能。而结果是:
- 开关声明:6.764077822秒
- 的查找表:6.665140483秒
我不知道为什么switch语句比查找表的运行速度较慢。正如我所知道的,使用跳转表的切换语句,我认为它应该比我的程序中的查找表运行得更快(它有额外的if语句)。
您的计时包括对'printf'的调用,这可能会导致结果不准确。 – Jonas
你应该看看生成的汇编代码。 –
,如果你打开了优化,'switch'和'if'将被一个优化的编译器优化掉。 – geza