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

标签 java optimization performance-testing nested-loops micro-optimization

根据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/

相关文章:

sql - 优化PG查询

sql-server - 优化只读sql数据库的技巧

performance - 是否有一个带有性能分析工具并存储性能测试结果的“结果服务器”?

java - 如何使用 XStream 将 XML 解析为 java 对象

java - int 数组中的 for 循环仅计算 if 语句中的第一个数组编号

java - 如何在java中低级别复制struct.pack

algorithm - 给定一个大小为 MxN 且具有正整数值的二维矩阵,找到具有最大和的闭环

go - benchmem 的输出

c - 多线程对速度没有改进 - 在 C 中使用 pthread - 为什么?

java - 如何检测Java中的电源溢出