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.

なぜこれが起こるのですか?クアッドコアプロセッサを搭載したInteli7を使用しています。私のハードウェア構成がこれに関与しますか?そうでない場合、考えられる理由は何でしょうか?

4

1 に答える 1

3

大きな違いの理由は、転送されるデータのサイズに関係なく発生するI / Oに関連するオーバーヘッドです。これは、タクシーに乗ったときの旗の落下のようなものです。Javaに制限されず、多くのO / S操作を含むオーバーヘッドには、次のものが含まれます。

  • ディスク上のファイルの検索
  • ファイルのO/S権限を確認しています
  • I/O用にファイルを開く
  • ファイルを閉じる
  • ファイルシステムのファイル情報を更新する
  • 他の多くのタスク

また、ディスクI / Oはページ単位で実行されるため(サイズはO / Sによって異なりますが、通常は2K)、1バイトのI/Oはおそらく2048バイトのI/Oと同じコストになります。 1Mb配列のバイト配列。

バッファリングされたI/Oを使用している場合は、より大きなI/Oタスクをさらに高速化できます。


最後に、「10Kb」として報告するのは実際にはわずか10バイトであるため、計算が正しくない可能性があります。

于 2013-01-31T21:04:06.487 に答える