c语⾔的If与Switch效率⽐较最近看到⽂章表⽰Switch⽐If慢,这⾥就来测试⼀下是否属实。
⽴刻打开VS,编写以下代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_LOOP 100000000
int nums[5];
void switchFunc()
{
int i, r;
srand((unsigned)time(NULL));
for(i =0; i < MAX_LOOP; i++)
{
r =rand()%5;
switch(r)
{
case3:
nums[3]++;
break;
case1:
nums[1]++;
break;
case2:
nums[2]++;
break;
case0:
nums[0]++;
break;
default:
nums[4]++;
break;
}
}
}
void ifFunc()
{
int i, r;
srand((unsigned)time(NULL));
for(i =0; i < MAX_LOOP; i++)
{
r =rand()%5;
if(r ==3)
nums[3]++;
else if(r ==1)
nums[1]++;
else if(r ==2)
nums[2]++;
else if(r ==0)
nums[0]++;
switch的用法c语言
else
nums[4]++;
}
}
int main()
{
clock_t start, finish, i;
double if_time, switch_time, if_total_time =0, switch_total_time =0;
int test_time =10;
printf("Start test.\n");
printf("Start test.\n");
printf(" \tswitch time\tif time\n");
for(i =0; i < test_time; i++)
{
memset(nums,0,sizeof(nums));
start =clock();
switchFunc();
finish =clock();
switch_time =(double)1000.0*(finish - start)/ CLOCKS_PER_SEC;
switch_total_time += switch_time;
start =clock();
ifFunc();
finish =clock();
if_time =(double)1000.0*(finish - start)/ CLOCKS_PER_SEC;
if_total_time += if_time;
printf("#%d\t%0.0fms\t\t%0.0fms\n", i +1, switch_time, if_time);
}
printf("\n");
printf("total\t%0.0fms\t\t%0.0fms\n", switch_total_time / test_time, if_total_time / test_time);
return0;
}
使⽤VS2022编译,在ReleaseX84环境下运⾏结果为:
Start test.
switch time    if time
#1      3929ms          3673ms
#2      3590ms          3584ms
#3      3606ms          3587ms
#4      3604ms          3585ms
#5      3601ms          3589ms
#6      3589ms          3586ms
#7      3605ms          3584ms
#8      3596ms          3581ms
#9      3591ms          3592ms
#10    3605ms          3593ms
total  3632ms          3595ms
测试结果表明,switch确实⽐if慢。这个原因来⾃CPU 分⽀预测。
编译器根据case的数量和case值的稀疏程度来翻译switch语句,当case情况⽐较多(例如4个以上),并且值的范围跨度⽐较⼩时,就会使⽤跳转表。
构建的跳转表为
.text:00415A6C jpt_4159A7      dd offset $LN10_0      ; DATA XREF: _switchFunc+97↑r
.text:00415A6C                dd offset $LN8          ; jump table for switch statement
.text:00415A6C                dd offset $LN9_0
.text:00415A6C                dd offset $LN7
增加了条件到0-9以后,swtich⽐if快。
修改后的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_LOOP 100000000
int nums[10];
void switchFunc()
{
int i, r;
srand((unsigned)time(NULL));
for(i =0; i < MAX_LOOP; i++)
for(i =0; i < MAX_LOOP; i++) {
r =rand()%10;
switch(r)
{
case8:
nums[8]++;
break;
case3:
nums[3]++;
break;
case7:
nums[7]++;
break;
case1:
nums[1]++;
break;
case4:
nums[4]++;
break;
case2:
nums[2]++;
break;
case0:
nums[0]++;
break;
case6:
nums[6]++;
break;
case5:
nums[5]++;
break;
default:
nums[9]++;
break;
}
}
}
void ifFunc()
{
int i, r;
srand((unsigned)time(NULL)); for(i =0; i < MAX_LOOP; i++) {
r =rand()%10;
if(r ==8)
nums[8]++;
else if(r ==3)
nums[3]++;
else if(r ==7)
nums[7]++;
else if(r ==1)
nums[1]++;
else if(r ==4)
nums[4]++;
else if(r ==2)
nums[2]++;
else if(r ==0)
nums[0]++;
else if(r ==6)
nums[6]++;
else if(r ==5)
nums[5]++;
else
nums[9]++;
nums[9]++;
}
}
int main()
{
clock_t start, finish, i;
double if_time, switch_time, if_total_time =0, switch_total_time =0;
int test_time =10;
printf("Start test.\n");
printf(" \tswitch time\tif time\n");
for(i =0; i < test_time; i++)
{
memset(nums,0,sizeof(nums));
start =clock();
switchFunc();
finish =clock();
switch_time =(double)1000.0*(finish - start)/ CLOCKS_PER_SEC;
switch_total_time += switch_time;
start =clock();
ifFunc();
finish =clock();
if_time =(double)1000.0*(finish - start)/ CLOCKS_PER_SEC;
if_total_time += if_time;
printf("#%d\t%0.0fms\t\t%0.0fms\n", i +1, switch_time, if_time);
}
printf("\n");
printf("total\t%0.0fms\t\t%0.0fms\n", switch_total_time / test_time, if_total_time / test_time); return0;
}
结果如下:
Start test.
switch time    if time
#1      3962ms          3900ms
#2      3732ms          3787ms
#3      3750ms          3794ms
#4      3738ms          3794ms
#5      3727ms          3796ms
#6      3735ms          3785ms
#7      3729ms          3797ms
#8      3725ms          3799ms
#9      3744ms          3800ms
#10    3739ms          3784ms
total  3758ms          3804ms
结论
当条件分⽀⽐较少的情况下,if⽐较快,当条件分⽀⽐较多的情况下,swtich⽐较快。
1.
2.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。