gpt4 book ai didi

java - Sandy-Bridge CPU 优化?

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:21 26 4
gpt4 key购买 nike

我编写了以下 Java 测试

public class NegativeTest {

/**
* @param args
*/
public static void main(String[] args) {

long start = System.currentTimeMillis();

int value = 12345;
for (int j = 0; j < 30; j++) {
for (int i = 0; i < 1000000000; i++) {
value = value * -1 - i;
}
}

System.out.println(System.currentTimeMillis() - start);

//to avoid compilation optimization
System.out.println(value);
}
}

在我的 Intel(R) Core(TM) i5-3210M (Ivy-Bridge) 机器上大约需要1.3 秒完成,但是在我更改线路后

值 = 值 * -1 - i

值=值-i

然后大约需要10秒完成(大约是之前版本的10倍)!

当我在其他非Sandy Bridge CPU上运行此测试时,结果完全相反:value = value * -1 - i 版本所需的时间是 value = value - i 版本的两倍!

谁能解释一下这个区别吗?是否与Sandy Bridge架构中具体的优化设计有关?

最佳答案

我确实在 C# .Net 4.6 x64 上尝试过同样的操作

1) 16239ms

2) 8175ms

现在如果我查看反汇编差异:

1)

value = value * -1 - i;
000007FE9958422A neg edx
000007FE9958422C sub edx,eax

2)

value = value - i;
000007FE995842A2 sub edi,eax

我有一个 i7 4790K。

如果我使用 double/float 而不是整数,则反汇编包含标量 AVX 代码,这可能会更快:

value = value * -1 - i;
000007FE9957422B vmulsd xmm0,xmm0,mmword ptr [7FE99574298h]
000007FE99574234 vcvtsi2sd xmm1,xmm1,eax
000007FE99574239 vsubsd xmm0,xmm0,xmm1

所以现在使用 AVX 2.0 来表示整数会很有趣。

编辑:

When I try this in C++, I get 0 seconds

其实这是在恶搞:)

请注意,基准测试并不容易,您需要仔细查看反汇编,使用精确的计数器,确保CPU不处于平衡能量模式,应用程序是最优先的,等等...

关于java - Sandy-Bridge CPU 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18951133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com