优化性能时,到目前为止,我被认为没有什么比switch语句快。这是绝对真理吗?
没有什么比最优算法快(实际上,没有什么可能是最快的,而是最优算法)。涉及开关vs如果的微优化很少会在现代系统上产生重大改进。但是,在有限的情况下(以及在较旧的计算机上),类似Duff's device的值很有价值(例如,大约1983年的计算机,同时在寄存器数量极其有限的计算机上进行计算机动画处理)。
本质上,switch语句是一系列跳转,这意味着O(n)性能。可以将哈希表用作跳转表,从而提高O(1)性能。不幸的是,除了身份之外,几乎没有其他哈希算法可以比一系列跳转更快或更快,并且仍然提供标识要检查的哈希条目所需的唯一哈希值。
我做了这个测试:
#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的速度还是比按位的更快。