C++11原子操作性能测试
2024-09-17 01:13:41
测试结论是发现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
不过这点性能对现在的计算机来说,应该没什么影响了。
最新文章
- jprofiler_监控远程linux服务器的tomcat进程(实践)
- python之haproxy配置文件操作(第三天)
- Java项目:学生成绩管理系统(一)
- Samba 4 Domain Controller on Ubuntu 14.04 LTS
- Python基础之装饰器
- 夺命雷公狗-----React---13--事件监听
- 安装uwsgi记录
- Eclipse颜色主题插件:Eclipse Color Theme
- Bash脚本15分钟进阶教程
- Pots of gold game:看谁拿的钱多
- ecmall数据库基本操作
- php5.6解决curl扩展不生效的问题
- Intent之跳转总结
- 【aardio】是否取消三个按键的对话框
- jquery mobile Touch事件
- Linux下安装SQL Server 2016(安装篇SQL Server on linux)
- SAPI
- MySQL内核整理(一)
- SCSS 实用知识汇总
- Javascript设计模式理论与实战:简单工厂模式