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

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

下面是测试过程以及代码

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

以前用到原子操作函数

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

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

#include <atomic>

std::atomic<long> g_data = ;

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

测试的源代码如下:

volatile long Sync_Add(volatile long* value)
{
#ifdef WIN32
return InterlockedIncrement(value);
#else
return __sync_add_and_fetch(value, );
#endif
} volatile long Sync_Sub(volatile long* value)
{
#ifdef WIN32
return InterlockedDecrement(value);
#else
return __sync_sub_and_fetch(value, );
#endif
} long g_data = ;
//std::atomic<long> g_data = 0; void threadfun()
{
for (int i=;i<;i++)
{
g_data = Sync_Add(&g_data);
//g_data++;
}
} int main(int argc, char* argv[])
{
int start = ::GetTickCount(); for (int i = ; i < ; i++)
{
std::thread t(threadfun);
t.join();
} std::cout<<"g_data = "<< g_data <<" use time = " << ::GetTickCount() - start << std::endl; system("pause");
return ;
}

运行结果:

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

  

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

C++11原子操作性能测试的更多相关文章

  1. C++11原子操作与无锁编程(转)

    不讲语言特性,只从工程角度出发,个人觉得C++标准委员会在C++11中对多线程库的引入是有史以来做得最人道的一件事:今天我将就C++11多线程中的atomic原子操作展开讨论:比较互斥锁,自旋锁(sp ...

  2. LoadRunner性能测试巧匠训练营

    <LoadRunner性能测试巧匠训练营>基本信息作者: 赵强 邹伟伟 任健勇 丛书名: 实战出版社:机械工业出版社ISBN:9787111487005上架时间:2015-1-7出版日期: ...

  3. 性能测试-Jmeter3.1 使用技巧

    一.JMeter官网 下载地址 http://jmeter.apache.org/download_jmeter.cgi Jmeter wiki https://wiki.apache.org/jme ...

  4. Loadrunner 11检查点使用方法总结

    在使用Loadrunner 11进行性能测试中,有时需要对性能测试中的功能是否全部正确进行判断.这里就需要用到“检查点”,本文总结了常用三种协议下检查点的使用方法,希望阅读本文后的小伙伴们能够掌握其使 ...

  5. RabbitMq 技术文档

    RabbitMq 技术文档 目录 1 AMQP简介 2 AMQP的实现 3 RabbitMQ简介 3.1 概念说明 3.2 消息队列的使用过程 3.3 RabbitMQ的特性 4 RabbitMQ使用 ...

  6. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. Loadrunner检查点使用总结

    在使用Loadrunner进行性能测试中,有时需要对性能测试中的功能是否全部正确进行判断.这里就需要用到“检查点”,本文总结了常用三种协议下检查点的使用方法,希望阅读本文后的小伙伴们能够掌握其使用方法 ...

  8. Jmeter3.1 使用技巧

    一.JMeter官网 下载地址 http://jmeter.apache.org/download_jmeter.cgi Jmeter wiki https://wiki.apache.org/jme ...

  9. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

随机推荐

  1. RabbitMQ挂掉问题处理

    开发环境中的rabbitmq总是会挂掉,rabbitmq的执行都是ssh远程登录执行命令: rabbitmq-server & 认为加了&,进程会在后台执行不会受到终端的影响.所以不知 ...

  2. iOS 关于枚举的使用

    枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. 使用: 枚举的定义如下: typed ...

  3. 关于URL重写

    1.  为什么要使用url重写? 先从session的原理讲起,为什么我们能够获得session中的东西呢?如果没有禁用cookie的话,那么session创建之后,会将session id的值通过r ...

  4. Java EE 7 / JAX-RS 2.0: Simple REST API Authentication & Authorization with Custom HTTP Header--reference

    REST has made a lot of conveniences when it comes to implementing web services with the already avai ...

  5. Unix文件操作

    一.概述 Unix文件操作常用函数包括open.close.creat.lseek.dup.dup2.fcntl等, 其中open.creat. fcntl函数需要包含头文件<fcntl.h&g ...

  6. Android Studio学习随笔-移动动画的实现

    在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...

  7. Codeforces Round #291 (Div. 2) C - Watto and Mechanism 字符串

    [题意]给n个字符串组成的集合,然后有m个询问(0 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) ,每个询问都给出一个字符串s,问集合中是否存在一个字符串t,使得s和t长度相同,并且仅有一个 ...

  8. segue生命周期

    segue生命周期:概述: 理解segue工作原理,需要理解一个segue对象的生命周期.segue对象是UIStoryboardSegue的实例或者是它的一个子类.所有iOS app都不能直接创建s ...

  9. C#使用Expand、Shell32解压Cab、XSN文件

    前言: 需要解压InfoPath表单的xsn文件,在项目中以前使用的是Expand命令行解压,都没有出过问题,近段时间项目中突然报错解压失败,通过分析解压操作得出结论: 1.正常正常情况下,expan ...

  10. 通过dbcp链接池对数据库操作报 Cannot create PoolableConnectionFactory (Could not create connection to database server. Attempted reconnect 3 times. Giving up.)--解决方案

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for ...