Joh*_*ine 10 java concurrency multithreading real-time
我对此非常好奇.如果使用值为0和1的AtomicIntegerArray,则可以完成AtomicBoolean数组的相同操作.例:
final AtomicIntegerArray array1 = new AtomicIntegerArray(10);
array1.compareAndSet(3, 0, 1); // 0 = false and 1 = true
// exactly the same thing of:
final AtomicBoolean[] array2 = new AtomicBoolean[10];
for(int i = 0; i < array2.length; i++)
array2[i] = new AtomicBoolean(false);
array2[3].compareAndSet(false, true);
Run Code Online (Sandbox Code Playgroud)
您认为哪一个更快更好?
Gra*_*ray 12
您认为哪一个更快更好?
有趣的问题.如果你做了很多次循环,那么这个速度可能只是可见的.否则担心它会过早优化.我会选择最干净,最容易维护的模式.
在封面下,两种方法都使用,Unsafe.compareAndSwapInt(...)因此性能可能非常相似.由于访问volatile存储没有阻塞,因此这不是冲突.该AtomicBoolean阵列肯定会有更多与之关联的对象 - 每个对象都有自己的易失性存储.此外,在封面下,AtomicBoolean存储boolean价值,int因此没有储蓄.
我的直觉告诉我要使用AtomicIntegerArray.您编写的代码较少,这通常意味着更多依赖JDK来做正确的事情.要想出来,你必须在生产架构上测试一些大量的迭代才能确定.我怀疑差异可以忽略不计,难以衡量.
不是一个很好的答案,但希望在这里有所帮助.
编辑:
所以我只是进行了一些测试,我看不出任何明显的差异.这是我的小测试程序.它使用了100个线程并运行了1000万次迭代,它们彼此相差0-10%.正如@mttdbrd指出的那样,这绝不是一个"现实生活"测试.只有在您真正知道是否存在差异之前,才能在生产中使用代码实际运行.
编辑:
在调整我的程序以确保我根据@ mttdbrd的文档预热热点编译器并更改程序以便能够更好地调整条目数之后,我看到了一些有趣的结果.
数组中有1000个元素:
AtomicIntegerArray in 4224 millis
AtomicBoolean[] in 3546 millis (always a little bit faster)
Run Code Online (Sandbox Code Playgroud)
但是数组中有10个元素:
AtomicIntegerArray in 26506 millis
AtomicBoolean[] in 13263 millis (much faster)
Run Code Online (Sandbox Code Playgroud)
另请注意速度差异.这是有道理的,因为有更多的线程争用.100个线程更可能需要旋转10个元素而不是1000个元素.
这是什么意思?如果你从一个改变到另一个,你可以节省自己每次操作最多1 纳秒.威力.因此,您应该选择最干净,最容易维护的模式,而不是担心两者的性能.
| 归档时间: |
|
| 查看次数: |
1415 次 |
| 最近记录: |