if-else switch效率

  • if-else依次不断比较;switch直接计算相对地址,条件较少时与if-else差不多
int main()
{	
00F31070  push        ebp  
00F31071  mov         ebp,esp  
00F31073  sub         esp,0Ch  

	int no = 4;
00F31076  mov         dword ptr [no],4  

	switch (no) {
00F3107D  mov         eax,dword ptr [no]  
00F31080  mov         dword ptr [ebp-4],eax  
00F31083  mov         ecx,dword ptr [ebp-4]  
//ecx - 最小的case
00F31086  sub         ecx,1  
00F31089  mov         dword ptr [ebp-4],ecx  
00F3108C  cmp         dword ptr [ebp-4],4  
//default情况
00F31090  ja          $LN8+0Fh (0F310E7h)  
00F31092  mov         edx,dword ptr [ebp-4]  
00F31095  jmp         dword ptr [edx*4+0F31104h]  

//生成一个跳转表,空间换时间
//根据edx = (ecx-1)的值跳转到不同的地方
//	0x00F31104  9c 10 f3 00  -> 00f3109c  	(case 1:)
//	0x00F31108  ab 10 f3 00  -> 00f310ab  	(case 2:)
//	0x00F3110C  ba 10 f3 00  -> 00f310ba	(case 3:)
//	0x00F31110  c9 10 f3 00  -> 00f310c9	(case 4:)
//	0x00F31114  d8 10 f3 00  -> 00f310d8	(case 5:)

	case 1:
		printf("no is 1\n");
00F3109C  push        0F32100h  
00F310A1  call        printf (0F31010h)  
00F310A6  add         esp,4  
		break;
00F310A9  jmp         $LN8+1Ch (0F310F4h)  
	case 2:
		printf("no is 2\n");
00F310AB  push        0F3210Ch  
00F310B0  call        printf (0F31010h)  
00F310B5  add         esp,4  
		break;
00F310B8  jmp         $LN8+1Ch (0F310F4h)  
	case 3:
		printf("no is 3\n");
00F310BA  push        0F32118h  
00F310BF  call        printf (0F31010h)  
00F310C4  add         esp,4  
		break;
00F310C7  jmp         $LN8+1Ch (0F310F4h)  
	case 4:
		printf("no is 4\n");
00F310C9  push        0F32124h  
00F310CE  call        printf (0F31010h)  
00F310D3  add         esp,4  
		break;
00F310D6  jmp         $LN8+1Ch (0F310F4h)  
	case 5:
		printf("no is 5\n");
00F310D8  push        0F32130h  
00F310DD  call        printf (0F31010h)  
00F310E2  add         esp,4  
		break;
00F310E5  jmp         $LN8+1Ch (0F310F4h)  
	default:
		printf("no is other\n");
00F310E7  push        0F3213Ch  
00F310EC  call        printf (0F31010h)  
00F310F1  add         esp,4  
		break;
	}

	int b = 3;
00F310F4  mov         dword ptr [b],3  
	return 0;
00F310FB  xor         eax,eax  
}
  • case跨度很小
int no = 4;

	switch (no) {
	case 3:
		printf("no is 3\n");
		break;
	case 5:
		printf("no is 5\n");
		break;
	case 7:
		printf("no is 7\n");
		break;
	case 9:
		printf("no is 9\n");
		break;
	case 10:
		printf("no is 10\n");
		break;
	default:
		printf("no is other\n");
		break;
	}

009E107D  mov         eax,dword ptr [no]  
009E1080  mov         dword ptr [ebp-4],eax  
009E1083  mov         ecx,dword ptr [ebp-4] 
//3 = min{case} 
009E1086  sub         ecx,3  
009E1089  mov         dword ptr [ebp-4],ecx  
//7 = max{case} - min{case}
009E108C  cmp         dword ptr [ebp-4],7  
009E1090  ja          $LN8+0Fh (09E10E7h)  
009E1092  mov         edx,dword ptr [ebp-4]  
009E1095  jmp         dword ptr [edx*4+9E1104h]  
//不连续、跨度小,情况下的跳转表
//	0x009E1104  9c 10 9e 00  -> 009e109c  	(case 3:)
//	0x009E1108  e7 10 9e 00  -> 009e10e7  	(default)
//	0x009E110C  ab 10 9e 00  -> 009e10ab  	(case 5:)
//	0x009E1110  e7 10 9e 00  -> 009e10e7  	(default)
//	0x009E1114  ba 10 9e 00  -> 009e10ba  	(case 7:)
//	0x009E1118  e7 10 9e 00  -> 009e10e7  	(default)
//	0x009E111C  c9 10 9e 00  -> 009e10c9  	(case 9:)
//	0x009E1120  d8 10 9e 00	 -> 009e109c  	(case 10:)
  • case跨度大
	switch (no) {
	case 3:
		printf("no is 3\n");
		break;
	case 5:
		printf("no is 5\n");
		break;
	case 20:
		printf("no is 20\n");
		break;
	case 22:
		printf("no is 22\n");
		break;
	case 23:
		printf("no is 23\n");
		break;
	default:
		printf("no is other\n");
		break;
	}
	
	switch (no) {
004A107D  mov         eax,dword ptr [no]  
004A1080  mov         dword ptr [ebp-4],eax  
004A1083  mov         ecx,dword ptr [ebp-4]  
// 3 = min{case}
004A1086  sub         ecx,3  
004A1089  mov         dword ptr [ebp-4],ecx  
// 20 = max{case} - min{case}
004A108C  cmp         dword ptr [ebp-4],14h  
004A1090  ja          $LN9 (04A10EEh)  
004A1092  mov         edx,dword ptr [ebp-4]  
004A1095  movzx       eax,byte ptr [edx+4A1120h] 
// edx=[0,20]
//生成一个case表
//	0x004A1120  00 05 01 05  ....
//	0x004A1124  05 05 05 05  ....
//	0x004A1128  05 05 05 05  ....
//	0x004A112C  05 05 05 05  ....
//	0x004A1130  05 02 05 03  ....
//	0x004A1134  04   
004A109C  jmp         dword ptr [eax*4+4A1108h] 
//不同case的跳转表 
//	0x004A1108  a3 10 4a 00   -> 004a10a3  	(case 3:)
//	0x004A110C  b2 10 4a 00   -> 004a10b2  	(case 5:)
//	0x004A1110  c1 10 4a 00   -> 004a10c1  	(case 20:)
//	0x004A1114  d0 10 4a 00   -> 004a10d0  	(case 22:)
//	0x004A1118  df 10 4a 00   -> 004a10df  	(case 23:)
//	0x004A111C  ee 10 4a 00   -> 004a10ee  	(default)
  • 跨度非常大switch和if-else差不多,不优化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值