gpt4 book ai didi

C++:Switch 语句与查找表的性能

转载 作者:太空狗 更新时间:2023-10-29 23:49:10 30 4
gpt4 key购买 nike

我尝试比较 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 Statement 比 Lookup tables 运行得慢。据我所知,使用跳转表的 Switch 语句,我认为它应该比我程序中的查找表运行得更快(它有额外的 if 语句)。

最佳答案

如果您使用优化进行编译,则您的代码没有开关,也没有查找表。我只是一个 for 循环,它使用相同的固定字符串多次调用 printf()。事实上,任何最低限度合理的编译器都会检测到 n = 3 从未更改并对其进行优化。也许您可以在循环内添加一个 n = rand() % 4;

另一方面,如果您没有进行优化编译,那么计时是没有意义的。

关于您的问题,我希望查找表比 switch 语句更快,因为 switch 语句将完全破坏分支预测,而 if 则没有问题,它始终为真。

关于C++:Switch 语句与查找表的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707685/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com