iamy
33686
|
2008/4/13 21:32:24 |
我分析了一下
执行代码 ==========
中间变量: ---------- Temp := Num1; Num1 := Num2; Num2 := Temp;
加减: ---------- Num1 := Num1 + Num2; Num2 := Num1 - Num2; Num1 := Num1 - Num2; 乘除: ---------- Num1 := Num1 * Num2; Num2 := Num1 div Num2; Num1 := Num1 div Num2;
异或: ---------- Num1 := Num1 xor Num2; Num2 := Num1 xor Num2; Num1 := Num1 xor Num2; push/pop: ---------- Push Num1 Push Num2 Pop Num1 Pop Num2
执行次数:1,000,000,000 执行时间单位:毫秒 ========== 中间变量:1281 加减:3218 乘除:56125 异或:1921 Push/Pop:5656 XOR:4890 分析 ========== 很明显,速度最快的是采用中间变量的方法 来说明一下为什么吧,从汇编级来解释就很清楚了
中间变量: ---------- mov edx,ebx mov ebx,esi mov esi,edx
这里执行的方法实际上是3个move的操作
加减: ---------- add esi,ebx mov edx,esi sub edx,ebx mov ebx,edx sub esi,ebx
一共执行了5条指令一个add两个move和两个sub的操作
乘除: ---------- imul ebx,esi mov eax,ebx cdq idiv esi mov esi,eax mov eax,ebx cdq idiv esi movebx,eax
哎...这个简直是惨不忍睹... 在CPU指令系统中mul和div操作都是要较长的时钟周期的
异或: ---------- xor ebx,esi xor esi,ebx xor ebx,esi
三个异或操作,貌似这里的操作也是比较简洁的,不过由于xor的执行时钟周期要长过mov所以他也比不上中间变量法
push/pop: ---------- push dword ptr [ebp-$04] push dword ptr [ebp-$08] pop dword ptr [epb-$04] pop dword ptr [ebp-$08]
两个push两个pop 看起来也不是很复杂,不过push和pop由于需要对栈进行操作,所以这个指令也需要比较多的CPU周期
总结 ========== 鱼和熊掌不可兼得,如果想速度快,就必须多使用4个字节的内存,如果想节约那4个字节的内存就必须多花些时间。 如果你不吝惜那4个字节的内存,就使用中间变量法,如果想不另外分配内存,无疑异或的方法是最好的。 注意! 这里并没有内存非配和函数栈的出入时间,如果作为函数频繁调用的时候这个因素是要考虑进去的。 另外,以上的分析只适用用于4字节integer的情况,其他类型,比如Int64,word,等等,并不一定适用。 |
iamy
33683
|
2008/4/13 18:49:22 |
哪一种方法的效率更高一些呢? |
ryyd
33663
|
2008/4/11 22:06:42 |
a=a+b b=a-b a=a-b |
kaikai_xp
33655
|
2008/4/11 14:58:30 |
push Num1 push Num2 pop Num1 pop Num2
这个IDEA很好 |
w77l
33609
|
2008/4/8 14:43:26 |
这个与茴写法有几不一样吧,这个有意义的啊,我觉得要做加密算法就可能用得上。 |
vliren
33575
|
2008/4/5 20:48:34 |
方法灵活,有见底! |
behind_sun
33559
|
2008/4/3 15:43:00 |
茴香豆的茴字有几种写法啊? |
delphiilove
33537
|
2008/4/1 22:12:41 |
强啊,学习了 |
qq757526555
33533
|
2008/4/1 20:01:55 |
我喜欢,后两个汇编的写法很好,我支持你. |
![]() |
|