18

이 질문에는 이미 답변이 있습니다.

Java에서 일부 알고리즘의 복잡성을 분석해야합니다. 이를 위해 많은 수의 입력을 제공하고 Java 구현 시간을 측정 할 계획입니다. 일부 코드 줄 사이에서 시간을 검사하는 가장 정확하고 정확한 방법은 무엇입니까? 밀리 초 단위의 정밀도가 필요합니다 ...


  • 정확히! System.nanoTime ()과 같은 것을 찾고 있었지만 위에서 언급 한 질문은 공식적인 벤치마킹에 대한 내용이었습니다. 그것은 평범한 독자를 도울지도 모르는 약간 깊은 독서를 요구한다. - Mangat Rai Modi
  • @MangatRai : "캐주얼 리더" 이 분야에서 위험합니다 : 거의 모든 경우정말"코드의 일부 라인들 사이의 시간을 체크"할 필요가있다. 아르무겁게그 질문에서 논의 된 것에 영향을받습니다. 그것이 없으면 쓸모 없거나 오해의 소지가있는 데이터를 얻고 잘못된 결정을 내리게됩니다. - Joachim Sauer
  • 귀하의 질문은 시간 복잡성과 관련이 있습니까? 성능 벤치마킹을 요구하는 반면 시간 복잡성은 정적 분석이라는 것을 알고 계십니까? - Val
  • @ Joachim Saucer 나는 그것을 이해한다. 캐주얼 리더를 통해 나는 자신의 이해를 위해 몇 가지 빠른 테스트를 실행하는 것을 의미했습니다. - Mangat Rai Modi
  • @val Time Complexity는 실제로 정적 분석이지만 성능 벤치마킹을 통해 추정 할 수 있습니다. 첫 번째 실행에서 n 개의 원소를주고, 2n, 3n ... 등등을줍니다. 내가 생각한 시간을 기준으로 그래프를 그려서 복잡성이 선형인지 높은 다항식인지를 말해보십시오. 확실하게, 우리는 정확한 시간 복잡성을 얻지 못할 것이다. 그러나 나는 이것을 약간의 코드로 연주하는 것에 대해 더 많이 질문했다. - Mangat Rai Modi

6 답변


15

를 사용하여 심지어 나노초 해상도를 얻을 수 있습니다.System.nanoTime().

그러나 다음 사항을 고려해야합니다.

Java로 정확한 마이크로 벤치 마크를 작성하려면 어떻게해야합니까?


  • 언급 한 질문은 좋은 것입니다. 나는 그것을 철저히 읽을 것이다 ... - Mangat Rai Modi

6

다음과 같은 라이브러리를 사용하십시오.Speed4j. 이것은 호출을 벤치마킹 할뿐만 아니라 로그에 통계를 제공 할뿐만 아니라 JMX를 통해 원격으로 통계를 볼 수도 있습니다. System.current ..를 코드 전체에 두는 것보다는 그러한 라이브러리를 사용하는 것이 더 좋습니다.



5

현미경으로 찍고 싶은 특별한 방법이 있다고 해봅시다. 다음과 같이 할 수 있습니다.

long time1 = System.nanoTime();
thatMethod();
long time2 = System.nanoTime();
long timeTaken = time2 - time1;  
System.out.println("Time taken " + timeTaken + " ns");  

컴퓨터가 정말 빠르므로 사용하는 경우 시간 차이가 발생할 수 있습니다.getTimeMillis()어쩌면 제로. 따라서,nanoTime()

당신은 또한 사용할 수 있습니다Caliper. 그들은 비디오를 가지고 시작합니다. 또한 다음 질문에 대한 답변을 철저히 읽으십시오.creichen. 그것에는 많은 훌륭한 것들이 있습니다.


4

용도System.nanoTime()또는System.currentTimeMillis()코드의 시작 및 종료 시간을 모두 얻으십시오. 마이크로 벤치 마크는 JVM 성능의 기본 측면만을 측정한다는 점을 기억하십시오. JVM의 워밍업 단계를 알고 있어야합니다.JIT시작되었습니다.



2

long start =  System.currentTimeMillis();
// your code
long end = System.currentTimeMillis();
long diff = end-start;

또는

long start =  System.nanoTime();
// your code
long end = System.nanoTime();
long diff = end-start;
long diffInMillis = diff/1000000;


  • 실행 시간을 알기 위해 currenttimemillis를 사용하지 않을 것을 제안합니다. - SpringLearner

2

long startTime = System.currentTimeMillis();

//code lines whose time you want to calculate 

long endTime = System.currentTimeMillis();
System.out.println("Took "+(endTime - startTime) + " ms");


  • 나는 너무 유혹 받는다.-1이 다음 코드를 포맷하십시오. 이미 명시된 것을 진술하지 마십시오. - Little Child

연결된 질문


관련된 질문

최근 질문