2013-01-31 2 views
4

은 내가 어떤 값을 채울처리량은

byte[] b = new byte[10]; 
byte[] b1 = new byte[1024*1024]; 

같은 배열이 다릅니다. 내가 시간을 사용하여 (이 두 배열의 처리량을 계산하려고하면

for(i=0;i<10;i++){ 
    b[i]=1; 
} 
for(i=0;i<1024*1024;i++){ 
    b1[i]=1; 
} 

그런 다음 나는 RandomAccessFile에로를 작성하고 사용하여 동일한 배열로 해당 파일에서 다시 읽어

randomAccessFile.write(arrayName); 
       and 
randomAccessFile.read(arrayName); 

을 말 다양한 크기 (10 바이트 및 1Mb)의 파일 읽기 및 쓰기에 대해 계산 된 경우, 처리량은 1MB 배열보다 많습니다.

Sample Output: 
Throughput of 10kb array: 0.1 Mb/sec. 
Throughput of 1Mb array: 1000.0 Mb/sec. 

왜 이런 일이 발생합니까? 쿼드 코어 프로세서가 장착 된 인텔 i7이 있습니다. 내 하드웨어 구성이 이에 책임이 있습니까? 가능한 이유가 무엇이 아닌가?

+4

저는 실제 전문가가이 질문에 대답하기를 기다리고 있습니다. 그 이유는 I/O가 일반적으로 청크에서 수행되기 때문입니다. 귀하의 10kb 어레이는 예를 들어 한 개의 512kb 청크에 들어 맞습니다. 즉, 512kb 어레이로 쓰는 데 많은 시간이 걸리므로 저장 장치 당 속도가 더 낮습니다. –

+2

처리량을 어떻게 계산합니까? –

+0

처리량을 청크/소요 시간으로 계산합니다. 여기서 청크 = (1 * 10)/1024; 10KB. 1 MB의 경우 청크 = 1; – Prasanna

답변

3

큰 차이가 나는 이유는 전송되는 데이터의 크기에 관계없이 발생하는 I/O 관련 오버 헤드입니다. 이는 택시를 타고가는 것과 같습니다.

  • 가 I의 파일을 열면 파일
  • 에 O/s의 권한을 확인 디스크
  • 에있는 파일을 찾기/O : 자바로 제한 많은 O/S 작업을 포함하지 않는 오버 헤드는 포함
  • 파일 닫기
  • 파일 시스템의
  • 업데이트 파일 정보
  • 많은 다른 작업

또한 디스크 I/O는 페이지 단위로 수행됩니다 (크기는 O/S에 따라 다르지만 일반적으로 2K). 따라서 1 바이트의 I/O는 2048 바이트의 I/O와 동일합니다. 약간 더 공정한 비교는 1Mb 배열이있는 2048 바이트 배열

버퍼링 된 I/O를 사용하면 더 큰 I/O 작업 속도가 더 빨라질 수 있습니다.


마지막으로 "10Kb"로보고하는 내용은 사실 10 바이트이므로 계산이 잘못되었을 수 있습니다.

관련 문제