测试结论是发现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

  

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

最新文章

  1. jprofiler_监控远程linux服务器的tomcat进程(实践)
  2. python之haproxy配置文件操作(第三天)
  3. Java项目:学生成绩管理系统(一)
  4. Samba 4 Domain Controller on Ubuntu 14.04 LTS
  5. Python基础之装饰器
  6. 夺命雷公狗-----React---13--事件监听
  7. 安装uwsgi记录
  8. Eclipse颜色主题插件:Eclipse Color Theme
  9. Bash脚本15分钟进阶教程
  10. Pots of gold game:看谁拿的钱多
  11. ecmall数据库基本操作
  12. php5.6解决curl扩展不生效的问题
  13. Intent之跳转总结
  14. 【aardio】是否取消三个按键的对话框
  15. jquery mobile Touch事件
  16. Linux下安装SQL Server 2016(安装篇SQL Server on linux)
  17. SAPI
  18. MySQL内核整理(一)
  19. SCSS 实用知识汇总
  20. Javascript设计模式理论与实战:简单工厂模式

热门文章

  1. jni java和C之间的值传递(int String int[])
  2. php做站点购物车 你搞懂了吗?
  3. Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
  4. JNI之本地线程进入c层
  5. Activity的任务栈Task以及启动模式与Intent的Flag详解
  6. Entity Framework 6 学习笔记
  7. jquery获取value值
  8. C# Wpf异步修改UI,多线程修改UI(二)
  9. sql - 复制表
  10. oracle批量转库工作,比较快捷的方式