if-else switch效率

news/2024/11/9 0:05:18/
  • 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差不多,不优化

http://www.ppmy.cn/news/291294.html

相关文章

[Warning] pointer to a function used in arithmetic

今天写一个代码题,碰到这个bug,网上搜是啥问题,发现碰到这个问题的人很少,而且基本没人写咋解决。然后我查了单词的意思,大概就是说在计算中使用了指向函数的指针。但是我的代码中没有使用指针呀。 就感觉很懵逼&#…

手机java短片_多媒体、JAVA游戏

多媒体功能: 3110c内置了一个音乐播放器,提供了对MP3,MP4,AAC,AAC,eAAC等多种音频格式的播放支持。其音乐播放器界面别树一格,感觉十分灵动精美。参数调节方面,3110c的播放器提供流行、摇滚、爵士、古典和两组自定义的EQ调节&…

android service更新widget,Android Widget+Service

问题 I have a music player which plays music using a service,all the broadcast receivers within that service are defined inside the service and not externally. I am totally new to widgets so i had been seeing a few tutorials.But they didnt help me much I a…

Linux内核配置蓝牙驱动,android bluetooth蓝牙移植,androidbluetooth

android bluetooth蓝牙移植,androidbluetooth 前段时间移植神念系统需要使用到bluetooth功能,现将移植过程中碰到的问题简要列一下,备忘而已。 1、内核增加配置 make menuconfig -> Networking support -> Bluetooth subsystem support --> 进行选择BT选项,至少选…

Linux恐慌信息详解,调试linux内核恐慌

我是内核调试的新手.Below是最后一个内核消息.根据我的理解,它试图访问空指针.但我不明白为什么它会关闭杯子0. Unable to handle kernel paging request at virtual address 40025694 [37655.473976] pgd d7138000 [37655.474007] [40025694] *pgd9ec1a831, *ptebf2e659d, *p…

flink状态和容错(三)

目录 state容错语义at most onceat least onceexactly-once 容错续跑算子容错续跑task异常作业逻辑不变CP/SP策略bugfix升级续跑SP策略 source容错续跑sink 容错续跑 state flink 支持有状态的流,存储历史的状态信息。 状态 状态分类 keystate keyBy/groupBy/Partit…

anyview+4.0java版_Anyview v4.0.12[带证书]

软件简介 Anyview可以阅读任意TXT文件,包括UNICODE、UTF-8、GB2312、HTML文件、PDB文件、UMD文件。 对于TXT文件,测试过8M的文件,处理速度可以接受。 Anyview支持滚屏,可以自己调整滚屏的速度;在阅读时,可以切换到全屏方式。 每5分钟,Anyview会为您保存一次阅读历史 有多…

老java手机有什么什么用,80后熟悉的这些手机功能,用过3种以上说明你已经老了...

原标题:80后熟悉的这些手机功能,用过3种以上说明你已经老了 又是一年元旦时,每到这时怀旧的心情便一发不可收拾。朋友圈等晒18岁照片成了热潮,可怜亓纪18岁的时候还没有手机。只有怀念一下那些年少轻狂时代用过的手机功能。 红外接…