ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-如何让GCC编译器将变量除法转换为mul(如果更快)

2019-10-12 19:05:34  阅读:243  来源: 互联网

标签:c optimization gcc division


int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", (unsigned int)a/(unsigned char)b);

编译时,我得到了
    …

    ::00401C1E::  C70424 24304000          MOV DWORD PTR [ESP],403024  %d %d
    ::00401C25::  E8 36FFFFFF              CALL 00401B60               scanf
    ::00401C2A::  0FB64C24 1C              MOVZX ECX,BYTE PTR [ESP+1C]
    ::00401C2F::  8B4424 18                MOV EAX,[ESP+18]                        
    ::00401C33::  31D2                     XOR EDX,EDX                             
    ::00401C35::  F7F1                     DIV ECX                                 
    ::00401C37::  894424 04                MOV [ESP+4],EAX                         
    ::00401C3B::  C70424 2A304000          MOV DWORD PTR [ESP],40302A  %d\x0A
    ::00401C42::  E8 21FFFFFF              CALL 00401B68               printf

如果将DIV转换为MUL并使用数组存储多值会更快吗?如果是这样,如何让编译器进行优化?

int main() {
    uint a, s=0, i, t;
    scanf("%d", &a);
    diviuint aa = a;
    t = clock();
    for (i=0; i<1000000000; i++)
        s += i/a;
    printf("Result:%10u\n", s);
    printf("Time:%12u\n", clock()-t);
    return 0;
}

其中diviuint(a)记为1 / a的内存并改用倍数
使用s = i / aa使速度成为s = i / a的2倍

解决方法:

当在编译时知道其中一个值时,用MUL替换DIV可能很有意义(但不一定在所有情况下都可以).当两者都是用户输入时,您不知道范围是多少,因此所有常规技巧都将失效.

基本上,您需要同时处理INT_MAX和INT_MIN之间的a和b.没有足够的空间来放大/缩小它们.即使您想将它们扩展为更大的类型,也可能需要更长的时间才能将b取反并检查结果是否一致.

标签:c,optimization,gcc,division
来源: https://codeday.me/bug/20191012/1902571.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有