zoukankan      html  css  js  c++  java
  • 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
    

      

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

  • 相关阅读:
    HDU6393(LCA + RMQ + 树状数组) n边图,两点最短距离 , 修改边权
    POJ 2763 (LCA +RMQ+树状数组 || 树链部分) 查询两点距离+修改边权
    HDU6396 (贪心+fread 挂)
    使用hadoop自带的例子作测试 笔记三
    hadoop的布暑方式 笔记二
    1 Hadoop原理介绍 笔记一
    ssh+flex
    openssh升级过程
    redhat5yum源配置
    struts2实现权限拦截
  • 原文地址:https://www.cnblogs.com/aizquan/p/4907129.html
Copyright © 2011-2022 走看看