2017-01-05 9 views
1

У меня возникли проблемы с выбором двух методов, которые включены внутри нескольких for. Я использую System.currentTimeMillis();. Проблема в том, что я не знаю, где положить время начала и время окончания. Я хочу, чтобы время 5 выполнялось методом methodA и methodB. Когда я запускаю его, я получаю 12 ms для метода А и 0ms для метода В, но программа занимает около 10 минут для запуска. Код, как показано ниже:Временной метод внутри несколько для java

 int count = 0; 
    double e = 0.3; 
    long startTimeA; 
    long endTimeA; 
    long startTimeB; 
    long endTimeB; 
    long sumA = 0; 
    long sumB = 0; 

    for(int k=0; k<5; k++){ 
     startTimeA = System.currentTimeMillis(); 
     startTimeB = System.currentTimeMillis(); 
     for(int i = 0; i < 40; i++) { 
      for(int j = i + 1; j < 40; j++) { 
       double a = methodA(); 
       endTimeA = System.currentTimeMillis() - startTimeA; 
       double b = methodB(); 
       endTimeB = System.currentTimeMillis() - startTimeB; 

       int c = methodC(); 

      } 
      sumA += endTimeA; 
      sumB += entTimeB; 
    } 
    } 
    System.out.println("total time A: " + sumA + " ms"); 
    System.out.println("total time B: " + sumB + " ms"); 
+1

Возможно, вы хотели напечатать sumA и sumB вместо endTimeA и endTimeB? –

+0

да, извините, что я хотел написать его sumA, sumB – flower

ответ

1

Вы должны прочитать о micro-benchmarking и как сделать это на практике.

Вот способ сделать то, что вы пытаетесь сделать:

private void doSomething() { 
    long startTimeA = System.currentTimeMillis(); 
    executeA(); 
    long endTimeA = System.currentTimeMillis(); 
    System.out.println("Total Time A: " + (endTimeA - startTimeA)); 

    long startTimeB = System.currentTimeMillis(); 
    executeB(); 
    long endTimeB = System.currentTimeMillis() - startTimeB; 
    System.out.println("Total Time B: " + (endTimeB - startTimeB)); 
} 

private void executeA() { 
    for(int k=0; k<5; k++) { 
     for(int i = 0; i < 40; i++) { 
      for(int j = i + 1; j < 40; j++) { 
       double a = methodA(); 
      } 
     } 
    } 
} 

private void executeB() { 
    for(int k=0; k<5; k++) { 
     for(int i = 0; i < 40; i++) { 
      for(int j = i + 1; j < 40; j++) { 
       double b = methodB(); 
      } 
     } 
    } 
} 
+0

да, но если я буду запускать все эти три раза для каждого метода, разве это не займет больше времени, чем один? – flower

+1

Я предполагаю, что 'methodA' и' methodB' - два независимых метода, и вы хотите каким-то образом сравнить их. Только для циклов 'for' не потребуется даже нескольких миллисекунд, и время будет в соответствии с основной сложностью этих двух методов. – user2004685

1
 for(int k=0; k<5; k++){ 
      sumA = 0; 
      sumB = 0; 
      for(int i = 0; i < 40; i++) { 
       for(int j = i + 1; j < 40; j++) { 
        startTimeA = System.currentTimeMillis(); 
        double a = methodA(); 
        endTimeA = System.currentTimeMillis() - startTimeA; 
        sumA += endTimeA; 

        startTimeB = System.currentTimeMillis(); 
        double b = methodB(); 
        endTimeB = System.currentTimeMillis() - startTimeB; 
        sumB += endTimeB; 

        int c = methodC(); 
       } 
     } 
     System.out.println("total time A: " + sumA + " ms"); 
     System.out.println("total time B: " + sumB + " ms"); 
     } 
+0

Да, но это дает мне общее время для каждого исполнения, я хочу, чтобы общее количество на 5 казней – flower

1

Просто переместите

sumA += endTimeA; 
sumB += entTimeB; 

в "для J" петли.