美文网首页
编译器除法优化(除法转乘法)

编译器除法优化(除法转乘法)

作者: 静析机言 | 来源:发表于2020-11-19 14:17 被阅读0次

除法运算效率在四种基本运算中最慢,是乘法的20倍左右。所以在被除数为固定值时(重要),编译器会把除法优化乘法。

设代码a/b = c                          b是常量

设b*k = 2^n                           2的n次直接用移位运算即可

a *2^n/ (b*2 ^n) = c

a * b *k/b = c* 2^n

a *k >> n =  c

所以a *k >> n = a/b //编译器会选择n的长度 从而保证后面位数舍弃时,造成的影响最小

下面让我们看一下代码

006A0200  /$  8B41 04       mov     eax, dword ptr [ecx+4]  ;

0F0C78A8 006A0203  |.  85C0          test    eax, eax

006A0205  |.  75 01         jnz     short 006A0208

006A0207  |.  C3            retn

006A0208  |>  8B49 08       mov     ecx, dword ptr [ecx+8]  ;  0F0C7938

006A020B  |.  2BC8          sub     ecx, eax

006A020D  |.  B8 398EE338   mov     eax, 38E38E39

006A0212  |.  F7E9          imul    ecx                     ;  EAX*ECX 低位放EAX  高位放EDX 006A0214  |.  C1FA 01       sar     edx, 1                  ;  右移1位

006A0217  |.  8BC2          mov     eax, edx

006A0219  |.  C1E8 1F       shr     eax, 1F

006A021C  |.  03C2          add     eax, edx

006A021E  \.  C3            retn

a * 0x38E38E39 >> 33 = a / 9

这个值要大于2^33 所以求值时2^n / b 要向上取整

b *k = 0x38E38E39*9= 0x20000 0001=(2^(32+1))+1    

上述代码:直接取edx相当于>>32,然后再sar edx,1,总体右移动了33位

下图为将除法转换为乘法的MagicNumber,从中也可以找到当b=9时,对应的MagicNumber为38E38E39。

相关文章

  • 编译器除法优化(除法转乘法)

    除法运算效率在四种基本运算中最慢,是乘法的20倍左右。所以在被除数为固定值时(重要),编译器会把除法优化乘法。 设...

  • "分数除法(三)"教学反思

    分数除法应用问题历来是教学中的难点,尤其是分数乘法与分数除法混编时,学生难以判断是用乘法还是用除法解答。为...

  • 难点解析(一)2022-11-18

    二年级上册学习了乘法与除法的初步认识,相比乘法,除法对学生的挑战更大,一方面除法是乘法的逆运算,与乘法有着紧密的联...

  • 第四讲 乘法器和除法器(Multiplier and Divid

    内容要点:乘法运算,乘法器的实现,除法运算,除法器的实现 乘法器的实现 Multiplicand (8-bit,S...

  • 工厂方法模式

    父类 加法类 减法类 乘法类 除法类 工厂接口 加法工厂 减法工厂 乘法工厂 除法工厂 使用 输出

  • C++性能优化一些知识点

    1. 整数用 >>或者<<,代替乘除法,用&代替 % 2. 乘法 > 除法 ,相同的除数,可以先计算倒数,然后乘法...

  • 教学反思

    这两天教有余数除法,上期学了乘法和除法,我看了参考书,先领会重难点和教学思想。 上课先复习了乘法和除法的含义,有没...

  • 数学作业2

    第一章 四则运算 第2课乘法和除法 姓名:洪子麓 一、乘除法模型巩固 乘法模型 ...

  • JS 加、减、乘、除运算避免浮点数

    加法运算 减法运算 乘法运算 除法运算

  • 我学会除法了

    今天我学会除法了。 我其实觉得除法非常难,可是学的时候一点都不难,非常简单,除法就是乘法倒过来...

网友评论

      本文标题:编译器除法优化(除法转乘法)

      本文链接:https://www.haomeiwen.com/subject/gpzkiktx.html