Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将盒装双精度乘以2的最有效方法?_Java_Double_Wrapper - Fatal编程技术网

Java 将盒装双精度乘以2的最有效方法?

Java 将盒装双精度乘以2的最有效方法?,java,double,wrapper,Java,Double,Wrapper,假设我们有一个装箱双变量foo,我们想把它的值乘以2,然后存储在另一个装箱双变量bar中。从以下几方面, 方法一: 以及 方法二: 考虑到效率、可读性等,哪一个更可取。?或者差异如此之小,以至于这些方法实际上是等效的?我认为,无论您如何尝试对其进行优化,java都会使这个版本成为Double bar=foo*2;至少与您的解决方案一样优化。试图获得这样的性能通常是徒劳的。我认为,无论您如何尝试优化它,java都会使这个版本成为双bar=foo*2;至少与您的解决方案一样优化。试图获得这样的表现通

假设我们有一个装箱双变量foo,我们想把它的值乘以2,然后存储在另一个装箱双变量bar中。从以下几方面,

方法一:

以及

方法二:


考虑到效率、可读性等,哪一个更可取。?或者差异如此之小,以至于这些方法实际上是等效的?

我认为,无论您如何尝试对其进行优化,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