2013-04-26 2 views
2

이미지에 대해 Java로 작성된 프로젝트에 대한 테스트를 일부 실행하고 있습니다. 나는 흥미로운 결과를 얻었고 그 이유를 알 수 없다. 다음은 초기화 라인이 BufferedImageImage입니다.BufferedImage가 Image보다 빨리 초기화되는 이유는 무엇입니까?

File[] files = new File("C:\\Users\\SAMSUNG\\Desktop\\img\\").listFiles(); 
time = System.currentTimeMillis(); 
for (File f:files){ 
    Image img = ImageIO.read(f); 
} 
System.out.println((System.currentTimeMillis() - time) + " miliseconds."); 

을 조심 :이 두 작업은 개별적으로 실행됩니다. 나는 위의 하나를 실행하고, 프로세스가 끝나고, 나는 실제로 아래쪽을 실행하는 것보다 죽은 끝을 얻는다는 것을 의미한다.

실행 중에 이러한 파일을 실행하면 동일한 파일에 접근하려고 시도 할 때 결과에 ​​영향을 미칠 수 있습니다. 결과는 40 분 가까이 있습니다. 그러나 BufferedImage 초기화는 항상 Image 초기화보다 빠릅니다. 왜 그런가요?

테스트를 세 번 실행하면 결과가 동일합니다.

+1

이것은 유효한 테스트는 아니며 동일한 메소드를 호출하지만 다른 유형으로 할당하는 것입니다. –

+0

또한 첫 번째 루프가 두 번째 루프가 활용하고있는 이미지 결과를 캐시하고 있음을 알 수 있습니다 (이미지를 다시 읽을 필요가 없음). – MadProgrammer

+0

초기화에는 차이가 없습니다. 차이점은'ImageIO.red (f)'의 결과를 할당 한 참조 유형입니다. 그 이유는 iluxa에 의해 주어졌습니다 : 두 번째 루프가 실행될 때, 핫스팟은 이미 코드를 최적화 할 기회를 가졌습니다. – Axel

답변

7

시간은 동일해야합니다. 귀하의 첫 번째 루프가 파일의 내용으로 일부 캐시를 예열하는 것으로 의심됩니다. 두 번째 루프에는 더 쉽게 시간이 있습니다.

가 읽기 순서 반전 시도 : 확인 Images 다음, BufferedImages 먼저, 그리고 첫째

+0

"실행 중에 이러한 파일을 실행하면 동일한 파일에 도달하려고 시도 할 때 결과에 ​​영향을 미칠 수 있으므로 별도로 실행해야합니다." 전체 코드를 붙여 넣습니다. –

+0

아직도. 하드 드라이브 캐시도 문제가됩니다. 가장 확실한 테스트는 다음과 같습니다. 컴퓨터를 재부팅하고 1 버전을 실행 한 다음 다시 재부팅하고 두 번째 버전을 실행합니다. – iluxa

+0

BufferedImage를 실행하는 것보다 이미지를 실행하는데, BufferedImage를 실행하는 것보다 (BufferedImage를 실행하는 것보다) Image를 다시 실행해야합니다. 나는 같은 결과를 얻는다. 어쨌든, 나는 그것을 시도하고 결과를 게시 할 것입니다. –

0

를 어떻게되는지 확인 (즉, 루프에서 전체 루프를 스틱) 당신은 그런 시험의 하나 개 이상의 실행을해야합니다, 두 번째로 System.NanoTime을 사용하는 것이 더 정확합니다. 세 번째로 다른 포스터가 제안한대로 실행 순서를 변경하거나 실행을 격리 (아마도 가장 안전한 방법)하는 것이 좋습니다.

+1

나노 시간이 필요하지 않습니다. –

관련 문제