代码说话:整数位操作比除法/取余慢多少?

#include <iostream>
#include <string>
#include <ctime>
#include <sys/timeb.h>
#include <boost/scoped_array.hpp>

using namespace std;

#define TIMES 100000000

time_t getms()
{
    timeb tb;
    ftime(&tb);
    return (int)(tb.time*1000 + tb.millitm);
}

int main()
{
    boost::scoped_array<int> data(new int[TIMES]);
    boost::scoped_array<int> result1(new int[TIMES]);
    boost::scoped_array<int> result2(new int[TIMES]);
    boost::scoped_array<int> result3(new int[TIMES]);
    for (int i = 0; i < TIMES; ++ i)
    {
        data[i] = i;
    }
    {
        time_t oldtime = getms();
        for (int i = 0; i < TIMES; ++ i)
        {
            result1[i] = (data[i] & 0x0F);                
        }
        time_t newtime = getms();
        cout << (newtime - oldtime) << endl;
       
    {
        time_t oldtime = getms();
        for (int i = 0; i < TIMES; ++ i)
        {
            result2[i] = data[i];
            result2[i] %= 16;
        }
        time_t newtime = getms();
        cout << (newtime - oldtime) << endl;
    }
    {
        time_t oldtime = getms();
        for (int i = 0; i < TIMES; ++ i)
        {
            result2[i] = data[i];
            result2[i] %= 15;
        }
        time_t newtime = getms();
        cout << (newtime - oldtime) << endl;
    }
    while (true)
    {
        int j;
        cin >> j;
        if (j == 0)
        {
            return 0;
        }
        {
            time_t oldtime = getms();
            for (int i = 0; i < TIMES; ++ i)
            {
                result3[i] = data[i];
                result3[i] %= j;            
            }
            time_t newtime = getms();
            cout << (newtime - oldtime) << endl;
           
    }
}
==========================================
结果(运行次数1亿次):
219        // 使用位操作
234        // 用取模操作%,但是被编译器优化成位操作,看汇编代码很明显
500        // mod 15, 无法优化,乖乖用除法去
13         // 我的输入,接下来做一亿次的mod 13
496        // 时间
15         // 我的输入,接下来做一亿次的mod 15
495        // 时间
16         // 我的输入,接下来做一亿次的mod 16
485        // 哈哈,现在没法优化了吧~乖乖做除法
17         // mod 17
484        // 时间
============================================
分析:
    整数位操作比除、模快一些,用上述数据大概2倍多(我也测试了256和65536作为除数)。对于常量来说,编译器会优化,试图用位操作替换。不过如果不是2的整数倍,也只能乖乖做除法去。如果想看有没有优化,查看汇编代码即可。
    大部分时候这种方法带来的性能提升并不明显,不过如果是关键路径的话,可能还是有用武之地。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值