如果我衡量执行一段代码所需的时间,意味着我知道代码的效率有多高?JAVA
给出以下代码,哪一个更有效?real方法returnSomething()实际上也可以返回0,因此需要try/catch如果我衡量执行一段代码所需的时间,意味着我知道代码的效率有多高?JAVA,java,profiling,processing-efficiency,performance,Java,Profiling,Processing Efficiency,Performance,给出以下代码,哪一个更有效?real方法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 l
//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部分的效率是第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;
}
}
公共类CodePerformanceTester
{
公共静态void main(字符串[]args){
CodePerformanceTester测试仪=新的CodePerformanceTester();
tester.start();
}
公开作废开始(){
双启动=System.currentTimeMillis();
长睡眠时间=200;
对于(int i=0;i第一部分可能比较慢,因为除法比比较值更昂贵。JVM很有趣,因为它可以根据调用代码的时间、位置和方式来提高或降低效率。最好使用分析器来查看瓶颈在哪里并修复它们。除此之外,您应该调用您的方法循环多次,应该多次尝试,并且需要交换测试顺序以查看哪个更快。在您的示例中,returnSomething确实返回1,JVM很可能会将其内联并相应地优化代码…在一段微不足道的代码上进行微基准测试,我认为最好执行int-ret=returnS某物();睡眠时间=200/(ret==0?1:ret)
:在temp-var中返回一些内容,只检查0,这比第一个要问的问题更健壮,尽管即使尝试进行这种过早的优化也值得吗?答案很可能是否定的,事实上,回答这一重要问题的是分析器可以真正发挥作用的地方。对于每一段代码,我都会运行测试每次我得到一个不同的结果,结果与前一个结果相差不远,所以我所做的是将所有的值相加,然后除以10。通过这样做,我发现第2段比第1段快。我想知道的是执行时间是否决定了代码效率。我将尝试使用分析器即使我没试过,谢谢。