2012-02-18 2 views
-2

다음 코드가 주어지면 어느 것이 더 효율적입니까? 실제 메소드 returnSomething()은 실제로 0을 리턴 할 수 있으므로 try/catch가 필요합니다. 내가 프로세서 사용의 측면에서 더 효율적입니다 코드의 어느 부분 이해하려고 노력했다코드 조각을 실행하는 데 걸리는 시간을 측정하면 코드가 얼마나 효율적인 지 알 수 있습니까? JAVA

//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; 
} 

, 그들은 같은 일을 BOT. 테스트를 위해 작성한 코드가 목적에 부합하는지 또는 코드에서 다른 종류의 테스트를 수행 할 수 있는지 여부를 알고 싶습니다. 필자의 발견에 따르면 하드 코드 if 문과 마지막 if 문이 항상 실행되지만 조각 2는 9 배 더 효율적입니다 (실행 시간이 9 배 짧음).

전체 작업 프로그램

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; 
    } 
} 
+1

JVM은 코드가 언제, 어디서 어떻게 호출되는지에 따라 다소 효과적 일 수 있다는 점에서 재미 있습니다. 병목이 어디 있는지 확인하고 문제를 해결하려면 프로파일 러를 사용하는 것이 가장 좋습니다. 이를 막으려면 메소드를 여러 번 반복해야하며 여러 번 시도해 봐야하며 테스트 순서를 바꿔 어떤 것이 더 빠르는지 확인해야합니다. –

+0

예에서 returnSomething은 1을 반환하고 JVM이 인라인으로 코드를 최적화 할 가능성이 큽니다 ... – assylias

+0

간단한 코드 조각에 마이크로 벤치 마크가 있습니다. int ret = returnSomething); sleepTime = 200/(ret == 0? 1 : ret);': 임시 변수에서 뭔가를 반환하고 0 만 확인하면보다 강력 해집니다. IMO –

답변

1

분할 값을 비교하는 것보다 더 비싼이기 때문에 첫 번째 부분은 아마 느립니다.