有什么东西比switch语句还快吗?

问题描述 投票:0回答:3

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

performance language-agnostic switch-statement
3个回答
2
投票

没有什么比最优算法快(实际上,没有什么可能是最快的,而是最优算法)。涉及开关vs如果的微优化很少会在现代系统上产生重大改进。但是,在有限的情况下(以及在较旧的计算机上),类似Duff's device的值很有价值(例如,大约1983年的计算机,同时在寄存器数量极其有限的计算机上进行计算机动画处理)。


1
投票

本质上,switch语句是一系列跳转,这意味着O(n)性能。可以将哈希表用作跳转表,从而提高O(1)性能。不幸的是,除了身份之外,几乎没有其他哈希算法可以比一系列跳转更快或更快,并且仍然提供标识要检查的哈希条目所需的唯一哈希值。


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的速度还是比按位的更快。

© www.soinside.com 2019 - 2024. All rights reserved.