일부 Java 코드를 계산하는 데 필요한 시간을 계산하는 일부 코드를 사용하여 일부 Java 기능의 효율성 또는 비효율을 느낄 수 있습니다. 그렇게해서 나는 정말로 이상하게 생긴 약간의 효과로 지금 막 붙잡 혔고, 나는 단지 자신을 설명 할 수 없다. 어쩌면 당신의 누군가가 나를 이해하도록 도와 줄 수 있습니다. 이 상대적으로 긴 계산 시간을 초래 시작Java 효율
public class PerformanceCheck {
public static void main(String[] args) {
List<PerformanceCheck> removeList = new LinkedList<PerformanceCheck>();
int maxTimes = 1000000000;
for (int i=0;i<10;i++) {
long time = System.currentTimeMillis();
for (int times=0;times<maxTimes;times++) {
// PERFORMANCE CHECK BLOCK START
if (removeList.size() > 0) {
testFunc(3);
}
// PERFORMANCE CHECK BLOCK END
}
long timeNow = System.currentTimeMillis();
System.out.println("time: " + (timeNow - time));
}
}
private static boolean testFunc(int test) {
return 5 > test;
}
}
(testFunc 심지어 호출되지 않도록 removeList가 비어 기억) :
time: 2328
time: 2223
...
을 removeList.size의 조합의 무엇이든을 교체하는 동안()> 0과 testFunc (3)을 사용하면 더 좋은 결과를 얻을 수 있습니다. 예를 들면 다음에
...
if (removeList.size() == 0) {
testFunc(3);
}
...
결과 (testFunc는 매번 불린다)
...
if (removeList.size() == 0);
testFunc(3);
...
:
time: 8
time: 7
time: 0
time: 0
심지어 낮은 계산 시간 서로 결과 독립된 두 함수 호출 결과 :
time: 6
time: 5
time: 0
time: 0
...
초기 예제의이 특정 조합 만 오래 걸립니다. 이것은 나를 자극하고 나는 그것을 정말로 이해하고 싶습니다. 뭐가 그렇게 특별한가요?
감사합니다.
추가 :
private static int testFunc2(int test) {
return 5*test;
}
처럼, 첫 번째 예제 뭔가 다른
if (removeList.size() > 0) {
testFunc(times);
}
에 testFunc()를 변경하면 빠른 다시 당할 것이다.
그리고이 테스트를 여러 번 실행했는데 다른 주문이 맞았습니까? 순서는 중요하지 않아야합니다. 다만 확인하십시오. 또한 아래 제안 된대로 nanoTime을 사용하여 동일한 결과를 얻고 있습니까? – prelic
이런 종류의 마이크로 벤치 마크는 꽤 나쁜 생각입니다. 또한 JIT가 임의의 시간에 다양한 결정을 내릴 수 있고 실제로 아무 것도 실현되지 않으면 코드를 완벽하게 최적화 할 수 있음을 알 수 있습니다. –
Java에서 코드 실행을 측정하려면 [System.nanoTime()] (http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime%28%29)을 사용해야합니다 . 더 정확합니다. 더 많은 토론 [이 질문에] (예 : http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime) – paislee