有没有比switch语句更快的东西?

时间:2013-11-19 02:18:59

标签: performance language-agnostic switch-statement

在优化性能时,到目前为止,我认为没有什么比switch语句更快。这是绝对真理吗?

3 个答案:

答案 0 :(得分:2)

没有什么比最佳算法更快(实际上什么都不是最快的,然后是最优算法)。涉及switch vs if的微优化很少会在现代系统上产生显着的改进。 但是,在有限的情况下(以及在较旧的计算机上),像Duff's device这样的东西是有价值的(例如大约1983年的计算机,而在计算机动画的数量非常有限的计算机上进行计算机动画)。

答案 1 :(得分:1)

一方面,switch语句是一系列跳转,这意味着O(n)性能。可以使用哈希表作为跳转表,从而实现O(1)性能。不幸的是,除了标识之外,很少有散列算法可以比跳过一系列快或快,并且仍然提供识别要检查的散列条目所需的唯一散列值。

答案 2 :(得分:0)

我做了这个测试:

#include <stdio.h>
#include <time.h>

int SwitchBase(int x)
{
    int TheReturn=22;
    switch (x)
    {
    case 1:
        TheReturn=1;
        break;
    case 2:
        TheReturn=2;
        break;
    case 3:
        TheReturn=3;
        break;
    case 4:
        TheReturn=4;
        break;
    case 5:
        TheReturn=5;
        break;
    case 6:
        TheReturn=6;
        break;
    case 7:
        TheReturn=7;
        break;
    case 8:
        TheReturn=8;
        break;
    case 9:
        TheReturn=9;
        break;
    case 10:
        TheReturn=10;
        break;
    default:
        TheReturn=0;
    }
    return TheReturn;
}

int BitwiseBase(int x)
{
    int TheReturn=22;
    TheReturn=
    ((((!(x^1))<< 31) >> 31) &1)
    |(((((x^1)&&(!(x^2)))<< 31) >> 31) &2)
    |(((((x^1)&&(x^2)&&(!(x^3)))<< 31) >> 31) &3)
    |(((((x^1)&&(x^2)&&(x^3)&&(!(x^4)))<< 31) >> 31) &4)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(!(x^5)))<< 31) >> 31) &5)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(!(x^6)))<< 31) >> 31) &6)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(x^6)&&(!(x^7)))<< 31) >> 31) &7)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(x^6)&&(x^7)&&(!(x^8)))<< 31) >> 31) &8)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(x^6)&&(x^7)&&(x^8)&&(!(x^9)))<< 31) >> 31) &9)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(x^6)&&(x^7)&&(x^8)&&(x^9)&&(!(x^10)))<< 31) >> 31) &10)
    |(((((x^1)&&(x^2)&&(x^3)&&(x^4)&&(x^5)&&(x^6)&&(x^7)&&(x^8)&&(x^9)&&(x^10))<< 31) >> 31) &0);
    return TheReturn;
}

int main()
{
    int randomnumber=23;
    int checknum=24;
    clock_t start, diff;
    srand(time(0));
    start = clock();
    for(int i=0;i<1000000;i++)
    {
        randomnumber = rand() % 11;
        checknum=SwitchBase(randomnumber);
        if (checknum!=randomnumber)
        {
            printf("s %i and %i",checknum,randomnumber);
        }
    }
    diff = clock() - start;

    int msec = diff * 1000 / CLOCKS_PER_SEC;
    printf("SwitchBase Time taken %d milliseconds", msec);

    start = clock();
    for(int i=0;i<1000000;i++)
    {
        randomnumber = rand() % 11;
        checknum=BitwiseBase(randomnumber);
        if (checknum!=randomnumber)
        {
            printf("b %i and %i",checknum,randomnumber);
        }
    }
    diff = clock() - start;

    msec = diff * 1000 / CLOCKS_PER_SEC;
    printf("BitwiseBase Time taken %d milliseconds", msec);

    return 0;
}

使用代码块和带有-O2的gcc编译器。 结果: SwitchBase花费的时间为15毫秒BitwiseBase花费的时间为31毫秒。 因此在这种情况下,Switch的速度还是比按位速度更快。