gpt4 book ai didi

java - 在双(或多)循环内部或外部声明/初始化变量

转载 作者:行者123 更新时间:2023-11-30 03:22:18 26 4
gpt4 key购买 nike

根据similar question ,以及多次 Google 搜索,在循环外部或内部声明或初始化变量“可能”在性能方面是相同的。

我正在运行计算机模拟,并且我正在尝试尽可能优化代码,因为它必须运行很多次,并且有多个内部循环和大量迭代。

我想知道是否值得将所有变量移到循环之外。我有许多“理论上”不断重新声明的变量。我说“理论上”是因为我不知道 Java 编译器是否真的优化了代码并在方法级别声明了所有内容。

基本上,什么会更有效率?代码A还是代码B?

代码A:

private void codeA() {
double a = 0.0;

for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}

代码B:

private void codeA() {
double a;

for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}

代码C:

private void codeC() {

for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
double a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}

在这个例子中我只使用了变量a,但是计算机模拟使用了更多。我的大多数变量都是基元(int、double、float)。为了提高性能而在循环外部声明原语是否有意义?

最佳答案

javac 不会优化。在所有 3 种情况下生成的字节码 is different 。 (javac Test.java 编译并 javap -c Test.class 显示字节码)

Java 虚拟机可能会优化。

JMH基准显示明显的赢家:

Benchmark           Mode  Cnt    Score    Error  Units
MyBenchmark.testA thrpt 20 423.437 ± 6.745 ops/s
MyBenchmark.testB thrpt 20 337.728 ± 56.363 ops/s
MyBenchmark.testC thrpt 20 351.419 ± 70.290 ops/s

单位是每秒的操作数,越多越好。 Benchmark source code 。使用OpenJDK IcedTea 2.5.4 Java虚拟机。

因此,在外部声明和初始化变量应该是最有效的。

关于java - 在双(或多)循环内部或外部声明/初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058658/

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