虚假共享和primefaces变量
当不同的变量位于同一个缓存行中时,您可能会遇到False Sharing ,这意味着即使两个不同的线程(在不同的核心上运行)正在访问两个不同的变量,如果这两个变量位于同一个缓存行中,您将拥有性能命中,因为每次都会触发缓存一致性。
现在说这些变量是primefaces变量(primefaces我指的是引入内存栅栏的变量,比如C ++的atomic
),会在那里进行虚假共享,或者primefaces变量是否在同一个缓存行中并不重要或者不是,据说他们无论如何都会引入缓存一致性。 换句话说,将primefaces变量放在同一个缓存行中会使应用程序变慢而不是将它们放在同一个缓存行中吗?
澄清:对于负面后果,至少应该写入一些对“错误共享”变量的访问。 如果写入很少,则虚假共享对性能的影响可以忽略不计; 写入越多(以及高速缓存行使消息无效)性能越差。
即使使用primefaces,缓存行共享(虚假或真实)仍然很重要。 在这里寻找一些证据: http : //www.1024cores.net/home/lock-free-algorithms/first-things-first 。 因此,答案是 – 是的,将不同线程使用的primefaces变量放在同一个缓存行上可能会使应用程序比将它们放到两个不同的行上更慢。 但是,我认为除非应用程序花费大量时间更新这些primefaces变量,否则它将被忽视。
将primefaces变量放在同一个缓存行中会使应用程序变慢而不是将它们放在同一个缓存行中吗?
虚假地共享“primefaces”变量可能会导致性能问题(无论是否会导致此类问题取决于很多事情)。
假设你有两个核心, A
和B
,每个核心都有自己的变量。 我们分别称这些变量为a
和b
。
A
在其缓存中有a
,而B
在其缓存中有b
。
考虑A
增加a
时会发生什么。
- 如果
a
和b
共享一个缓存行,则B
的b
副本将失效,并且其对b
下一次访问将导致缓存未命中。 - 如果
a
和b
不共享缓存行,则就其缓存的b
副本而言,对B
没有影响。
无论a
和b
是否为“primefaces”,都会发生这种情况。
如果您使用具有最强一致性要求的primefaces变量,一个完整的内存屏障,则错误共享的效果可能不会明显。 对于这种访问,primefaces操作的性能基本上受到存储器访问等待时间的限制。 所以事情总是很慢,我不认为他们会在虚假分享的情况下变慢。
如果你有其他较少侵入性的内存排序,primefaces本身所遭受的性能可能会更低,因此虚假共享的影响可能会很大。
总的来说,我首先要看一下primefaces操作本身的性能,然后再担心这种操作的错误共享。