0

在使用 IEEE754 浮点数时,我发现了两种将 32 位变量的前 9 位归零的方法。他们中的任何一个都比另一个更好吗?

Java 相关补充:是否有一些列表提供有关指令效率的信息?我随机发现 BIPUSH 通常应该比 LDC 快,但除此之外没有太多。

// 10111111110010100011110101110001 bits
// 00000000010010100011110101110001 significand

int bits = 0b10111111110010100011110101110001;
int significand = bits & 0b11111111111111111111111;
int significand2 = bits << 9 >>> 9;

字节码……</p>

L4
    LINENUMBER 49 L4
    ILOAD 0
    LDC 8388607 // = 0b11111111111111111111111
    IAND
    ISTORE 5
L5
    LINENUMBER 50 L5
    ILOAD 0
    BIPUSH 9
    ISHL
    BIPUSH 9
    IUSHR
    ISTORE 6

谢谢。:)

4

2 回答 2

3

字节码是一种可移植的中间语言。为了获得良好的性能,现代 JVM 会将其即时编译为本机代码,因此不要过多解读:CPU 实际执行的内容可能看起来非常不同。您必须分析生成的本机代码才能得出关于 X 性能优于 Y 的原因的结论。

如何打印生成的汇编代码取决于 JVM,有关 Hotspot(即 Oracle JDK 和 OpenJDK)的说明,请参见此处:http: //mechanical-sympathy.blogspot.com/2013/06/printing-generated -assembly-code-from.html

于 2013-10-04T23:38:52.053 回答
0

一般来说,移位操作应该更快。这是一个简单的 Java 测试和结果值:

int bits = 0b10111111110010100011110101110001;

long time = System.nanoTime();
int significand;
for (int i = 0; i < 1000000000; i++) {
    significand = bits & 0b11111111111111111111111;
}
System.out.println(String.format("Time: %f (ms)",
    (System.nanoTime() - time) / 1000000f));

long time2 = System.nanoTime();
for (int i = 0; i < 1000000000; i++) {
    significand = bits << 9 >>> 9;
}
System.out.println(String.format("Time 2: %f (ms)",
    (System.nanoTime() - time2) / 1000000f));

时间 1:7.003190(毫秒)
时间 2:2.633435(毫秒)

当然,这些是大量重复的结果。

于 2013-10-04T23:45:28.927 回答