【问题标题】:If I measure the time it takes to execute a piece of code means I know how efficient the code is? JAVA如果我测量执行一段代码所需的时间意味着我知道代码的效率如何? JAVA
【发布时间】:2012-03-09 20:29:59
【问题描述】:

给定以下几段代码,哪一个更高效?真正的方法returnSomething()在现实中也可以返回0,所以需要try/catch。

//piece one
long sleepTime = 200;
try{ sleepTime /= returnSomething();}
catch(Exception e){sleepTime = 200;}
private int returnSomething(){
   return 1;
}

              //or

//piece two
long sleepTime = 200;
if(returnSomething() == 3){sleepTime = 67;}
else if(returnSomething() == 2){sleepTime = 100;}
else if(returnSomething() == 1){sleepTime = 200;}
private int returnSomething(){
   return 1;
}

我试图找出哪段代码在处理器使用方面更有效,它们的机器人做同样的事情。我想知道我为测试编写的代码是否适合该目的,或者我是否可以对代码进行其他类型的测试。我的发现表明,第 2 部分的效率提高了 9 倍(执行时间减少了 9 倍),即使它使用硬代码 if 语句并且始终执行最后一个 if 语句。

完整的工作程序

public class CodePerformanceTester
{
    public static void main(String[] args){
        CodePerformanceTester tester = new CodePerformanceTester();
        tester.start();
    }

    public void start(){
       double start = System.currentTimeMillis();
       long sleepTime = 200;
       for(int i=0; i<10000000; i++){

           //uncoment here the two lines below
           //try{ sleepTime /= returnSomething();}
           //catch(Exception e){sleepTime = 200;}

           //coment the IF STATEMENTS when above code uncomented
           if(returnSomething() == 3){sleepTime = 67;}
           else if(returnSomething() == 2){sleepTime = 100;}
           else if(returnSomething() == 1){sleepTime = 200;}
       }
       double end = System.currentTimeMillis();
       System.out.println("Execution time for 10 million iteration was "+(end-start)+" ms.");
    }


    private int returnSomething(){
       return 1;
    }
}

【问题讨论】:

  • JVM 很有趣,因为它可以根据何时、何地以及如何调用代码来提高或降低效率。最好使用分析器来查看瓶颈可能在哪里并修复它们。除此之外,您应该在循环中多次调用您的方法,并且应该多次尝试这样做,并且需要交换测试顺序以查看哪个更快。
  • 在您的示例中,returnSomething 确实返回 1,JVM 很可能会内联它并相应地优化代码...
  • 在一段微不足道的代码上进行微基准测试,我认为最好做int ret=returnSomething();sleepTime =200/(ret==0?1:ret);:在临时变量中返回一些东西,只检查0,它更健壮IMO
  • 第一个要问的问题是,即使尝试进行这种过早的优化,是否值得付出努力?答案很可能是否定的,事实上,回答这个重要问题是分析器真正发挥作用的地方。
  • 对于每段代码我运行了十次测试,但是每次我得到不同的结果时,结果与之前的相差不远,所以我所做的就是添加所有值向上然后将它们除以10。通过这样做,我发现第2块比第1块快。我想知道的是执行时间是否决定了代码效率。即使我从未尝试过,我也会尝试使用分析器。谢谢。

标签: java profiling processing-efficiency performance


【解决方案1】:

第一部分可能比较慢,因为除法比比较值更昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2017-12-31
    相关资源
    最近更新 更多