나는 다음과 같은 간단한 코드 몇 가지 성능 테스트 (백만 정수 주위 요약)를하고 있었다 :자바 실행 시간은 문자열 포맷팅의 영향을 받습니까?
final int[] array = new int[1024 * 1024];
// populate values
for (int i = 0; i < array.length; i++) {
array[i] = i % 100;
}
long start, end, sum = 0;
start = System.nanoTime();
// calculate sum
for (int i : array) {
sum += i;
}
end = System.nanoTime() - start;
System.out.println(end);
평균 실행 시간은 약 1.8ms했다.
그런 다음 테스트 결과 프레젠테이션을 변경하기로 결정했습니다. 나는 다음과 같은 성명 (형식 문자열)와 System.out.println(end)
대체 :
System.out.printf("Time in %dns, sum: %d\n", end, sum);
을 그리고 내 평균 실행 시간은 약 2.8ms 것을 발견 할 때 매우 놀라운 일이었다. 그것은 단지 1 밀리 세컨드 (큰 문제는 아니지만)이지만 다른 한편으로 그것은 약 약 50 %입니다. 더 많은 것은 테스트 결과 프레젠테이션 (및 형식화)이 종료 시간 측정 후에 수행되므로 이론적으로 은 평균 실행 시간에 영향을주지 않아야합니다.
System.out.printf
진술을 추가 한 후 평균 실행 시간이 더 오래 걸리는 이유를 알고 계십니까? 재정렬 (변수 : end
에 값을 할당하기 전에 서식이 지정됨)으로 인해 발생 했습니까?
이러한 측정 값을 신뢰할 수있게 재현 할 수 있습니까? 밀리 세컨드 차이는 아무리 큰 a * relative * 차이가 있더라도 무작위 노이즈의 범위에 있습니다. – delnan
충분한 테스트를 수행하지 않았습니다. 100.000 시간을하고 두 방법이 모두 측정하는 방법을보십시오. 내 컴퓨터에서 몇 가지 간단한 테스트를 통해 모두 동일한 범위에 있음을 알 수 있습니다. –