Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 在双(或多)循环内部或外部声明/初始化变量_Java_Optimization_Performance Testing_Nested Loops_Micro Optimization - Fatal编程技术网

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

Java 在双(或多)循环内部或外部声明/初始化变量,java,optimization,performance-testing,nested-loops,micro-optimization,Java,Optimization,Performance Testing,Nested Loops,Micro Optimization,根据一个和多个Google搜索,在循环外部或内部声明或初始化变量“可能”在性能方面是相同的 我正在运行一个计算机模拟,我正在尝试尽可能地优化代码,因为它必须运行很多次,并且它有多个内部循环和大量迭代 我想知道是否值得将所有变量移出循环。我有很多“理论上”不断被重新声明的变量。我说“理论上”是因为我不知道Java编译器是否真的优化了代码,并在方法级别声明了所有内容 基本上,什么更有效率?代码A还是代码B 代码A: private void codeA() { double a = 0.0;

根据一个和多个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
    }
}
private void codeA(){
双a=0.0;
for(inti1=0;i
代码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
    }
}
private void codeA(){
双a;
for(inti1=0;i
代码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
    }
}
private void编解码器(){
for(inti1=0;i

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

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

Java虚拟机可以进行优化

基准测试显示了明确的赢家:

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
单位为每秒操作数,越多越好。使用OpenJDK IcedTea 2.5.4 Java虚拟机


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

代码已经准备好了,为什么不检查运行时,比如每个函数的1000000次调用呢。如果差异很大,你会注意到的,不是吗?别忘了读一读:如果在那个例子中有什么需要改进的地方,那么HotSpot()可能比你做得更好。您应该尝试编写清晰的代码,这意味着尽可能减少变量的范围。(重新发布以修复链接)@toto_tico只有一种方法:测量。但说实话,如果真的有什么不同,我会非常惊讶。@toto_tico,对了,很抱歉。我认为这样的问题可能会以“询问工具/库”或“基于主要观点”来结束。但是,与此同时,我正在本地建立JMH来测试您的东西,所以我可能会在一段时间内为您提供一个答案。(不过我花了5分钟以上的时间:))