pde*_*eva 39 java performance multithreading volatile
我知道写入volatile变量会将其从所有cpus的内存中刷新,但是我想知道对volatile变量的读取是否和正常读取一样快?
可volatile变量永远被放置在CPU缓存或者它总是从主存储器中获取?
Ale*_*øld 17
你应该看看这篇文章:http://brooker.co.za/blog/2012/09/10/volatile.html.博客文章认为,与x86上的非易失性读取相比,volatile读取(也适用于x86)要慢得多.
感谢Marc Booker运行这些测试.
Tim*_*der 13
答案有点依赖于架构.在x86上,没有专门针对易失性读取的额外开销,尽管对其他优化有影响.
澄清:没有任何与读取本身相关的额外开销.内存屏障用于确保正确的排序.JSR-133对"LoadLoad,LoadStore,StoreLoad和StoreStore"四个障碍进行了分类.根据架构,这些障碍中的一些对应于"无操作",意味着不采取任何行动,其他障碍需要围栏.没有与Load本身相关的隐式成本,但是如果有栅栏就可能会产生一个成本.对于x86,只有StoreLoad屏障会产生栅栏.
正如博客文章中所指出的那样,变量是易失性的这一事实意味着对变量的性质有一些假设,这些变量无法再进行,并且某些编译器优化不会应用于volatile.
挥发性不是应该被明智地使用的东西,但它也不应该被担心.有很多情况下,挥发性就足以代替更重的锁定.
dru*_*dru -2
易失性意味着编译器无法通过将变量的值放入 CPU 寄存器来优化该变量。必须从主存储器访问它。然而,它可以被放置在CPU高速缓存中。缓存将保证系统中任何其他 CPU/内核之间的一致性。如果内存映射到IO,那么事情就有点复杂了。如果是这样设计的,硬件将阻止该地址空间被缓存,并且对该内存的所有访问都将进入硬件。如果没有这样的设计,硬件设计者可能需要额外的CPU指令来确保读/写通过缓存等。
通常,“易失性”关键字仅用于操作系统中的设备驱动程序。
| 归档时间: |
|
| 查看次数: |
6386 次 |
| 最近记录: |