首页 Linux 使用pthread时,使用全局变量的C显示比指针慢100%?

使用pthread时,使用全局变量的C显示比指针慢100%?

我有一个很好的程序来显示2个类似程序的性能,它们都使用2个线程来进行计算.核心区别在于,一个使用全局变量,另一个使用“新”对象,如下所示:#includepthread.h #includestdlib.h struct M{ long a; long b; }obj; size_t count=2000000

我有一个很好的程序来显示2个类似程序的性能,它们都使用2个线程来进行计算.核心区别在于,一个使用全局变量,另一个使用“新”对象,如下所示:

#include

它很慢,然后我修改了obj以动态创建(我预计它会更慢):

#include

它比前一个快100%.我也试过linux,同样的结果.
但是如何解释呢?我知道obj是全局变量,但是* obj仍然是全局变量,只是动态创建的.核心区别是什么?
最佳答案
我认为这确实是因为虚假分享,正如Unimportant所说的那样.

为什么差异呢,你可能会问?

因为计数变量!由于这是一个变量,并且size_t的基础类型对您来说很长,编译器无法对其进行优化(因为pl可能指向计数).如果count是一个int,由于严格的别名规则,编译器可以优化它(或者只是它可以是const size_t).

因此生成的代码必须每次在循环中读取计数.

在第一个示例中,count和obj两个全局变量,它们彼此靠近.因此,链接器很可能将这些变量放入同一缓存行中.因此,写入obj.a或obj.b将使计数的缓存行无效.因此CPU必须同步读取计数.

在第二个例子中,obj被分配在堆上,它的地址将远离count,因此它们不会占用相同的缓存行.计数不需要同步.

本文来自网络,不代表青岛站长网立场。转载请注明出处: https://www.0532zz.com/html/zhonghe/fwq/linux/20200925/10382.html
上一篇
下一篇

作者: dawei

【声明】:青岛站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

【免责声明】本站内容转载自互联网,其发布内容言论不代表本站观点,如果其链接、内容的侵犯您的权益,烦请提交相关链接至邮箱xwei067@foxmail.com我们将及时予以处理。

Copygight © 2016-2023 https://www.0532zz.com All Rights Reserved.青岛站长网

站长:xwei067#foxmail.com(请把#换成@)