Java 在新变量中保存方法的结果时速度更快?

Java 在新变量中保存方法的结果时速度更快?,java,performance,memory-management,Java,Performance,Memory Management,我想知道当我将一个方法的结果保存在一个新的变量中以供进一步使用时,除了可读性之外,它是否对性能有帮助。我的想法是,像这样的方法只需要处理一次,还是这是一种误解,只是浪费内存 这里我保存了一个方法的结果,因为我将多次使用它 byte[] headerAsArray = getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOrigin

我想知道当我将一个方法的结果保存在一个新的变量中以供进一步使用时,除了可读性之外,它是否对性能有帮助。我的想法是,像这样的方法只需要处理一次,还是这是一种误解,只是浪费内存

这里我保存了一个方法的结果,因为我将多次使用它

  byte[] headerAsArray = getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOriginalURI());
        bb.writeInt(headerAsArray.length);
        bb.writeBytes(headerAsArray);

如果您的意思是试图避免多次调用getHeaderByteArray,那么是的,您做的完全正确。几乎在所有情况下,拥有一个额外的局部变量的成本都可以忽略不计。我想说,它也比以下选项更具可读性:

bb.writeInt(getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOriginalURI()).length);
bb.writeBytes(getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOriginalURI()));
太可怕了!如果出于某种原因getHeaderByteArray可以为每个调用返回不同的结果,那么它也可能不正确。在这种情况下不太可能,但总的来说是可能的。例如,两次调用System.currentTimeMillis与一次调用System.currentTimeMillis并使用结果两次有很大的区别

不过,我可能会通过添加一个接受currentResponse类型的方法来进一步重构它。然后,您可以将代码更改为:

byte[] header = getHeaderBytes(currentResponse);
bb.writeInt(header.length);
bb.writeBytes(header);
如果您发现自己经常编写这样的代码,那么您可能还需要编写一个方法,该方法接受字节数组,然后写入长度和字节。在这一点上,你可以写:

writeDataWithLengthPrefix(getHeaderBytes(currentResponse));

如果您的意思是试图避免多次调用getHeaderByteArray,那么是的,您做的完全正确。几乎在所有情况下,拥有一个额外的局部变量的成本都可以忽略不计。我想说,它也比以下选项更具可读性:

bb.writeInt(getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOriginalURI()).length);
bb.writeBytes(getHeaderByteArray(currentResponse.getHttpResponse(), currentResponse.getOriginalHost(), currentResponse.getOriginalURI()));
太可怕了!如果出于某种原因getHeaderByteArray可以为每个调用返回不同的结果,那么它也可能不正确。在这种情况下不太可能,但总的来说是可能的。例如,两次调用System.currentTimeMillis与一次调用System.currentTimeMillis并使用结果两次有很大的区别

不过,我可能会通过添加一个接受currentResponse类型的方法来进一步重构它。然后,您可以将代码更改为:

byte[] header = getHeaderBytes(currentResponse);
bb.writeInt(header.length);
bb.writeBytes(header);
如果您发现自己经常编写这样的代码,那么您可能还需要编写一个方法,该方法接受字节数组,然后写入长度和字节。在这一点上,你可以写:

writeDataWithLengthPrefix(getHeaderBytes(currentResponse));

您是对的,通过将方法的结果保存在变量中,可以避免多次调用它,从而降低复杂性。唯一被浪费的空间是字节数组的大小,但是,稍后您将需要字节数组,所以我不会称之为浪费。希望我理解了您的问题。

您是对的,通过将方法的结果保存在变量中,可以避免多次调用,从而降低复杂性。唯一被浪费的空间是字节数组的大小,但是,稍后您将需要字节数组,所以我不会称之为浪费。希望我理解了你的问题。

查看代码执行情况的最佳方法是查看其字节码:javap-c编译器优化是为了避免内存浪费,因此如果编译器优化处于活动状态,它将处理它。就我个人而言,我使代码更具可读性,其余的留给compiler@Pooya:编译器不会在此处删除对getHeaderByteArray的第二个调用…这取决于context@JonSkeet我担心的是存储结果会浪费内存,我认为这不是浪费内存。查看代码的最佳方式是查看其字节码:javap-c编译器优化是为了避免内存浪费,所以如果编译器优化是活动的,它会处理它。就我个人而言,我使代码更具可读性,其余的留给compiler@Pooya:编译器不会在此处删除对getHeaderByteArray的第二个调用…这取决于context@JonSkeet问题是存储结果会浪费内存,我认为这并不是浪费内存假设我的字节数组是巨大的10 Mb,那么存储结果的成本可能会很高对于一个额外的局部变量高?这里不是这样,但我要求将军understanding@HerrDerb:否,因为额外的局部变量只是对字节数组对象的引用。了解变量的值从来都不是对象,它只是一个基本值或引用,这一点非常重要。假设我的字节数组是巨大的10 Mb,那么额外的局部变量的成本可能会很高?这里不是这样,但我要求将军understanding@HerrDerb:否,因为额外的局部变量只是对字节数组对象的引用。了解变量的值从来不是对象,它只是一个基本值或引用,这一点非常重要。字节数组的大小不会被浪费。引用的大小可能会被浪费,但这是完全不同的。如果getHeaderByteArray每次都返回一个新的字节数组,那么本地变量实际上是在保存字节数组的大小,以避免新的分配 字节数组的大小不会被浪费。引用的大小可能会被浪费,但这是完全不同的。如果getHeaderByteArray每次都返回一个新的字节数组,那么本地变量实际上是在保存字节数组的大小,以避免新的分配。