在优化性能时,到目前为止,我认为没有什么比switch语句更快。这是绝对真理吗?
答案 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的速度还是比按位速度更快。