在Effective Java一书中,它指出:
语言规范保证读取或写入变量是原子的,除非变量是类型
long或double[JLS,17.4.7].
"原子"在Java编程或一般编程的上下文中意味着什么?
(顺便说一句.这是指32位操作系统)
一些更新:
这绝对是一个对齐问题
有时对齐(无论出于什么原因?)是如此糟糕,以至于对双倍的访问速度比其最快访问速度慢50倍.
在64位机器上运行代码减少了问题,但我认为它仍然在两个时间之间交替(我可以通过将双倍更改为32位机器上的浮点数来获得类似结果)
在mono下运行代码没有问题 - 微软,你有没有机会从那些Novell家伙那里复制一些东西?
有没有办法在c#中记忆对齐类的分配?
以下演示(我认为!)没有双打正确对齐的不良.它对存储在类中的double执行一些简单的数学计算,对每次运行进行计时,在变量上运行5次定时运行,然后再分配新的并重新执行.
基本上结果看起来像你有一个快速,中等或慢速的记忆位置(在我的古代处理器上,这些最终每次运行大约40,80或120ms)
我曾尝试使用StructLayoutAttribute,但没有任何乐趣 - 也许还有其他事情正在发生?
class Sample
{
class Variable { public double Value; }
static void Main()
{
const int COUNT = 10000000;
while (true)
{
var x = new Variable();
for (int inner = 0; inner < 5; ++inner)
{
// move allocation here to allocate more often so more probably to get 50x slowdown problem
var stopwatch = Stopwatch.StartNew();
var total = 0.0;
for (int i = 1; …Run Code Online (Sandbox Code Playgroud)