C++11原子操作性能测试

测试结论是发现C++11原子操作在性能上,比以往用到的InterlockedIncrement或__sync_add_and_fetch性能上慢了1倍左右。

另外补充一点,在对原子变量进行比较的时候,最好是引用它操作后的返回值,而不要直接用原子变量进行比较,比如:

下面是测试过程以及代码

std::atomic<long> g_data = 0;
long v = ++g_data;
if(v = 1000)
{
    dosomething();
}

//不要用下面的方式,可能某个线程已将g_data原子的值设置为了1000,而引起不只一个线程执行下面的动作
if(g_data = 1000) 
{
    dosomething();
}

 

以前用到原子操作函数

volatile long Sync_Add(volatile long* value)
{
#ifdef WIN32
    return InterlockedIncrement(value);
#else
    return __sync_add_and_fetch(value, 1);
#endif
}

volatile long Sync_Sub(volatile long* value)
{
#ifdef WIN32
    return InterlockedDecrement(value);
#else
    return __sync_sub_and_fetch(value, 1);
#endif
}

 

C++ 11自带原来操作<atomic>

#include <atomic>

std::atomic<long> g_data = 0;

g_data++; //线程安全的原子操作

 

测试的源代码如下:

volatile long Sync_Add(volatile long* value)
{
#ifdef WIN32
    return InterlockedIncrement(value);
#else
    return __sync_add_and_fetch(value, 1);
#endif
}

volatile long Sync_Sub(volatile long* value)
{
#ifdef WIN32
    return InterlockedDecrement(value);
#else
    return __sync_sub_and_fetch(value, 1);
#endif
}

long g_data = 0;
//std::atomic<long> g_data = 0;

void threadfun()
{
    for (int i=0;i<10000;i++)
    {
        g_data = Sync_Add(&g_data);
        //g_data++;
    }
}



int main(int argc, char* argv[])
{
    int start = ::GetTickCount();

    for (int i = 0; i < 1000; i++)
    {
        std::thread t(threadfun);
        t.join();
    }

    std::cout<<"g_data = "<< g_data <<" use time = " << ::GetTickCount() - start << std::endl;

    system("pause");
    return 0;
}

 

运行结果:

g_data = 10000000 use time = 1497 //C++11的<atomic>
g_data = 10000000 use time = 717   //非C++11

  

不过这点性能对现在的计算机来说,应该没什么影响了。

转载于:https://www.cnblogs.com/aizquan/p/4907129.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值