<< 2006/12/15 | Home | 2006/12/17 >>
PR: 転職    葬式    マンスリーマンション 神戸    北海道    環境    FX    不動産担保融資    桐ヶ谷斎場    海外旅行    専門学校   

JDK 6.0

昔、ASCIIの実践Javaで、artonさんがStreamとNIOでファイルコピーの比較を掲載していたのだけど、あの頃は1.4だったので6.0ならば、どうかなと思って、やってみた。環境は、Core 2 Duo(3.4Gにover clock)で、Windows XP、DiskはSATA(3Gbps) Seagateの7200rpmのもの。ローカルファイル(サイズ670MB)のコピー時間を計ってみた。3回測定し、平均値から大きく逸脱しているものは除いて平均をとってみた。単位は秒。

Stream:

1k2k4k8k16k32k64k
26.126.026.226.026.328.728.4

Nio:
1k2k4k8k16k32k64k
26.426.126.324.826.326.328.0

う〜ん、今回もNIOとStreamでは大差無しかな。というかバッファサイズって1kもあれば十分なんだね。でもディスクアクセスの音を聞いていると、どうもバッファサイズは効いていないような気もする。もっとOSに近いレイヤでバッファリングがかかっていて、アプリケーションでバッファリングしても、これだけCPUが速い時代になると無意味なのかもしれない。何しろCPU使用率は、どのケースも有意差無しだったし。しかしバッファサイズが大きいとなんで遅くなるんだろう。Streamが32kで、ちょっと遅くなるのに対しNioは64kからちょっと遅くなるという傾向も興味深い。

ちなみにcmdでふつーにcopyしたら、27.8秒だった。cmdのcopyもバッファサイズが大きいのかな。

使用したプログラム:

--- CopyByStream.java ---
import java.io.*;

public class CopyByStream {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();

        String copyFrom = args[0];
        String copyTo = args[1];
        int bufferSize = 32 * 1024;
        if (args.length > 2) {
            bufferSize = Integer.parseInt(args[2]) * 1024;
        }
        if (bufferSize <= 0)
            throw new IllegalArgumentException("Invalid buffer size(=" + bufferSize + ").");
        byte[] buf = new byte[bufferSize];

        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(copyFrom);
            out = new FileOutputStream(copyTo);
            
            while (true) {
                int readLength = in.read(buf);
                if (readLength == -1) break;
                out.write(buf, 0, readLength);
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
        finally {
            if (in != null) {
                try {in.close();}
                catch (IOException ex) {ex.printStackTrace();}
            }
            if (out != null) {
                try {out.close();}
                catch (IOException ex) {ex.printStackTrace();}
            }

            System.console().printf("Elapsed %,d%n",System.currentTimeMillis() - startTime);
        }
    }
}
--- CopyByNio.java ---
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;

public class CopyByNio {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();

        String copyFrom = args[0];
        String copyTo = args[1];
        int bufferSize = 32 * 1024;
        if (args.length > 2) {
            bufferSize = Integer.parseInt(args[2]) * 1024;
        }
        if (bufferSize <= 0)
            throw new IllegalArgumentException("Invalid buffer size(=" + bufferSize + ").");

        FileChannel in = null;
        FileChannel out = null;
        try {
            in = new FileInputStream(copyFrom).getChannel();
            out = new FileOutputStream(copyTo).getChannel();
            ByteBuffer buf = ByteBuffer.allocateDirect(bufferSize);
            while (true) {
                int readLength = in.read(buf);
                if (readLength == -1) break;
                buf.flip();
                out.write(buf);
                buf.rewind();
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
        finally {
            if (in != null) {
                try {in.close();}
                catch (IOException ex) {ex.printStackTrace();}
            }
            if (out != null) {
                try {out.close();}
                catch (IOException ex) {ex.printStackTrace();}
            }

            System.console().printf("Elapsed %,d%n",System.currentTimeMillis() - startTime);
        }
    }
}

チャーリーくん家

チャーリーくんの家に遊びに行ってきた。チャーリーくんは夢久の兄弟。兄弟だけあって、仕草や容姿がとても似ている。





このまぶしそうな顔なんか、そっくり。








これは、お友達のNeneちゃん。なんかずっと怒っていたんだけど、なんで、そんなに怒っているのかは、良く分からず ^^;














どうも、私は、普段のチャーリー君の席に座ってしまっていたようで、そのせいか、ちょっとご機嫌斜めだったかも。ごめんね。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8