繁体   English   中英

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

[英]C++: Performance of Switch Statement vs Lookup tables

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

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

另一方面,如果你没有进行优化编译,那么采取时间是没有意义的。

回到你的问题,我希望查找表比switch语句更快,因为switch语句将完全破坏分支预测,而if将没有问题,总是如此。

您的基准测试完全不足以衡量switch /查找表性能:几乎所有时间都花在printf()调用上。 如果switch /查找表差异有任何影响,由于总运行时间较长,测量噪声会使其相形见绌。


供参考:我希望在热,紧的循环中查找表只有大约十个时钟周期。 在2 GHz CPU上,对于所有10000000次迭代,这只是0.05秒(粗略估计,很容易错误两倍,但这不会影响整体评估)。 这是订单总运行时间的1%!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM