Java 将盒装双精度乘以2的最有效方法?
假设我们有一个装箱双变量foo,我们想把它的值乘以2,然后存储在另一个装箱双变量bar中。从以下几方面, 方法一: 以及 方法二:Java 将盒装双精度乘以2的最有效方法?,java,double,wrapper,Java,Double,Wrapper,假设我们有一个装箱双变量foo,我们想把它的值乘以2,然后存储在另一个装箱双变量bar中。从以下几方面, 方法一: 以及 方法二: 考虑到效率、可读性等,哪一个更可取。?或者差异如此之小,以至于这些方法实际上是等效的?我认为,无论您如何尝试对其进行优化,java都会使这个版本成为Double bar=foo*2;至少与您的解决方案一样优化。试图获得这样的性能通常是徒劳的。我认为,无论您如何尝试优化它,java都会使这个版本成为双bar=foo*2;至少与您的解决方案一样优化。试图获得这样的表现通
考虑到效率、可读性等,哪一个更可取。?或者差异如此之小,以至于这些方法实际上是等效的?我认为,无论您如何尝试对其进行优化,java都会使这个版本成为Double bar=foo*2;至少与您的解决方案一样优化。试图获得这样的性能通常是徒劳的。我认为,无论您如何尝试优化它,java都会使这个版本成为双bar=foo*2;至少与您的解决方案一样优化。试图获得这样的表现通常是徒劳的。第一个。它具有更好的可读性,并将所有装箱/拆箱操作隐藏在幕后 不要把这种简单操作的效率想象成乘以2 …还是长篇大论 有两种方法:
void method1() {
Double foo = 1.0;
Double bar = foo * 2;
}
void method2() {
Double foo = 1.0;
Double bar = Double.valueOf(foo.doubleValue() * 2);
}
用javac编译并用javap查看字节码指令
你能看出区别吗?第一个。它具有更好的可读性,并将所有装箱/拆箱操作隐藏在幕后 不要把这种简单操作的效率想象成乘以2 …还是长篇大论 有两种方法:
void method1() {
Double foo = 1.0;
Double bar = foo * 2;
}
void method2() {
Double foo = 1.0;
Double bar = Double.valueOf(foo.doubleValue() * 2);
}
用javac编译并用javap查看字节码指令
你能看出区别吗?方法一比较好 它可以被人类阅读 在其他条件相同的情况下,字符数越少越好 编译器可能会消除任何性能差异。
方法一更好 它可以被人类阅读 在其他条件相同的情况下,字符数越少越好 编译器可能会消除任何性能差异。
从可读性来看,你可以自己回答这个问题,从效率来看,我认为时间取决于vm的实现。这两者应该是等价的,因为自动装箱被编译成一个调用valueOf@IanRoberts:虽然经常声称,但实际上这不是必需的。JLS仅指定将非NaN的原语double p转换为类和类型为double的引用r,以便r.doubleValue的计算结果为p。编译器也可以使用新的Double而不是Double.valueOfp,并且仍然遵循JLS。@jarnbjo原则上是正确的,但是。@IanRoberts:所以如果mishadoff的车是黑色的,所有的车都是黑色的?从可读性来看,你可以自己回答这个问题,从效率来看,i asume取决于vmi的实现,这两者应该是等效的,因为自动装箱被编译成对valueOf@IanRoberts:虽然经常声称,但实际上这不是必需的。JLS仅指定将非NaN的原语double p转换为类和类型为double的引用r,以便r.doubleValue的计算结果为p。编译器也可以使用新的Double而不是Double.valueOfp,并且仍然遵循JLS。@jarnbjo原则上是正确的,但是。@IanRoberts:所以如果mishadoff的车是黑色的,所有的车都是黑色的?我知道这种微优化是徒劳的。我只是出于好奇才这么问的!我知道这种类型的微优化是徒劳的。我只是出于好奇而问!非常同意第1点和第3点。在进行任何优化之前,这些可能是你首先想到的事情。非常同意第1点和第3点。在进行任何优化之前,这些可能是您首先想到的事情。正如我在对问题的评论中指出的,装箱转换是特定于实现的。如果您在编译器的输出中没有看到差异,并不意味着我的编译器也会这样做。正如我在对问题的评论中指出的,装箱转换是特定于实现的。如果在编译器的输出中看不到差异,并不意味着我的编译器也会这样做。
void method1() {
Double foo = 1.0;
Double bar = foo * 2;
}
void method2() {
Double foo = 1.0;
Double bar = Double.valueOf(foo.doubleValue() * 2);
}
void method1();
Code:
0: dconst_1
1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
4: astore_1
5: aload_1
6: invokevirtual #3 // Method java/lang/Double.doubleValue:()D
9: ldc2_w #4 // double 2.0d
12: dmul
13: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
16: astore_2
17: return
void method2();
Code:
0: dconst_1
1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
4: astore_1
5: aload_1
6: invokevirtual #3 // Method java/lang/Double.doubleValue:()D
9: ldc2_w #4 // double 2.0d
12: dmul
13: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
16: astore_2
17: return