argius note

プログラミング関連

やらかしました

相変わらず、蟷螂と格闘中ですが、そんな中、NewIOをちょっと勉強しようと思い、(Input/Output)StreamとChannelの比較をするため、以前書いたStream版ファイルコピーのコードをとりだしてみた。
さて、Stream版のバッファサイズはー....とcopyメソッドを見ると、こんなんなってました。

// サンプル1
private static void copy(InputStream is, OutputStream os) throws IOException {
    for (int c; (c = is.read()) != -1;) {
        os.write(c);
    }
}

バッファリングしてない。何故だ。バッファリングくらい知ってたはずなのに。
NewIOどころではないので、とりあえずこれをバッファリングするのに書き換えて実行時間を比較。(2006.03.01:一部修正)

// サンプル2
private static void copy(InputStream is, OutputStream os) throws IOException {
    byte[] buffer = new byte[0x1000];
    for (int c; (c = is.read(buffer)) >= 0;) {
        os.write(buffer, 0, c);
    }
    os.flush();
}
ファイル:約19MB (キャッシュされていないこと)
サンプル1の結果: 102234 ミリ秒
サンプル2の結果:   5657 ミリ秒

こんなっ... バカなっ...*1

*1:一概に遅いから悪いとは言えないが、この差はちょっと致命的。