やまろうのJavaなわけ
2003年
Vol.22 java.io VS java.nio どっちが速い?ファイル読み込み
読者の皆さんは巨大なファイルを読み込む時にどうしますか?
「まぁ、ふつうにBufferedInputStreamかねぇ?」
それもいいんですが、JDK1.4で追加されたjava.nio(New I/O)の方が
より向いています。New I/Oは、ヒープの外にバッファを割り当てることが
可能であり、大容量で高速なアクセスが可能となります。
とはいえ、
「ホントに速いのぉ~???」
ということで今回はjava.io VS java.nioと題し、ホントにNew I/Oが速い
のかどうか確かめてみたいと思います。
それでは選手入場です。
赤コーナー、java.io所属ぅー、BufferedInputStream!!!!!
青コーナー、java.nio所属ぅー、FileChannel!!!!!
Ready Fight!!
*/
package etc;
import java.io.*;
import java.nio.*;
import java.nio.channels.FileChannel;
public class ReadTime {
public static void main(String[] args) throws Exception {
printTime(100);
printTime(1000);
printTime(10000);
printTime(100000);
printTime(1000000);
printTime(10000000);
printTime(100000000); //(*)100Mのファイル
}
/**
* fileSizeの大きさのファイルを作成し、そのファイルをjava.ioとjava.nioのそれぞれの
* クラスで読み込んで実行時間を出力する。nioって本当に速いのかを調べる!
* @param fileSize 実験で読み込むファイルのbyte数
*/
public static void printTime(int fileSize) throws Exception {
System.out.println("ファイルサイズ=" + fileSize + "byte");
String file = "bigFile";
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(file));
for (int i = 0; i < fileSize; i++) {
out.write(new byte[1]);
}
out.close();
long start1 = System.currentTimeMillis();
byte[] b1 = readUsingIO(file);
long end1 = System.currentTimeMillis();
long time1 = end1 - start1;
long start2 = System.currentTimeMillis();
byte[] b2 = readUsingNIO(file);
long end2 = System.currentTimeMillis();
long time2 = end2 - start2;
System.out.println("java.ioで読み込んだ時間=" + time1 + "ミリ秒");
System.out.println("java.nioで読み込んだ時間=" + time2 + "ミリ秒");
System.out.println("java.ioの方が" + (time1 - time2) + "ミリ秒多くかかった\n");
}
/**
* filePathのファイルを読み込んでbyte配列に格納して返す。java.ioを使う。
* @param filePath
* @return ファイルの中身
*/
public static byte[] readUsingIO(String filePath)
throws IOException {
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(filePath));
byte[] data = new byte[in.available()];
int size = in.read(data);
System.out.println("size="+size);
return data;
}
/**
* filePathのファイルを読み込んでbyte配列に格納して返す。java.nioを使う。
* @param filePath
* @return ファイルの中身
*/
public static byte[] readUsingNIO(String filePath)
throws IOException {
FileInputStream in = new FileInputStream(filePath);
FileChannel channel = in.getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect((int)channel.size());
channel.read(buf);
buf.flip();
byte[] data = new byte[buf.capacity()];
buf.get(data);
channel.close();
return data;
}
}
/*
実行でぃ!
その前に一つ確認、このプログラム実行すると最終的に100Mくらいの
ファイルが出来上がるので、ディスクの容量が足りない人は(*)をコメント
アウトしてからにして下さい。
それじゃぁ、実行でぃ!
javac -d . *.java
java -Xms100m -Xmx500m etc.ReadTime
del bigFile
[実行結果]
ファイルサイズ=100byte
size=100
java.ioで読み込んだ時間=0ミリ秒
java.nioで読み込んだ時間=78ミリ秒
java.ioの方が-78ミリ秒多くかかった
ファイルサイズ=1000byte
size=1000
java.ioで読み込んだ時間=0ミリ秒
java.nioで読み込んだ時間=0ミリ秒
java.ioの方が0ミリ秒多くかかった
ファイルサイズ=10000byte
size=10000
java.ioで読み込んだ時間=0ミリ秒
java.nioで読み込んだ時間=0ミリ秒
java.ioの方が0ミリ秒多くかかった
ファイルサイズ=100000byte
size=100000
java.ioで読み込んだ時間=0ミリ秒
java.nioで読み込んだ時間=0ミリ秒
java.ioの方が0ミリ秒多くかかった
ファイルサイズ=1000000byte
size=1000000
java.ioで読み込んだ時間=0ミリ秒
java.nioで読み込んだ時間=16ミリ秒
java.ioの方が-16ミリ秒多くかかった
ファイルサイズ=10000000byte
size=10000000
java.ioで読み込んだ時間=94ミリ秒
java.nioで読み込んだ時間=140ミリ秒
java.ioの方が-46ミリ秒多くかかった
ファイルサイズ=100000000byte
size=100000000
java.ioで読み込んだ時間=1063ミリ秒
java.nioで読み込んだ時間=1266ミリ秒
java.ioの方が-203ミリ秒多くかかった
-Xms100m -Xmx500mってのは、
それぞれメモリ割り当てプールの初期サイズ、最大サイズです。
かなりでかいファイル読み込むのででかめにしてあります。
で実行に結構時間かかるので低スペックのPCを使ってる方は気をつけてちょ!
で実行結果ですけども、
「い、いいのかなぁ・・・・・、こんな結果で・・・」
「全てにおいてNew I/Oの方が、お、遅いねぇ」
コーディングの仕方が悪いのか、それとももっとでかいファイルを
扱う場合は速いとかですかねぇ。
嫌な終わり方だけど、んじゃ
やまろう
ブログ アーカイブ
-
▼
2009
(28)
-
▼
8月
(28)
- JavaScript와 Ajax를 이용한 비동기식
- link
- タグファイル
- [DB]ナチャラルキー(自然キー)とサロゲートキー(代替キー)
- Version Number パターンによる排他制御
- [S2JDBC]排他制御について
- jquery - iframe
- jdk api window help file format
- Javaの理論と実践: 並行コレクション・クラス
- Tigerでのアノテーション 第1回: Javaコードにメタデータを追加する
- 実用的なXML: Java NIOへの取り組み バッファーおよびチャネルに寄り道する方法
- java.io VS java.nio
- XLSBeansExcelとJavaBeansをJava 5のアノテーションでマッピングするためのラ...
- Windows XP で使用可能なショートカット キー一覧
- Windows ショートカットキー
- 「設計書(Excelブック形式)からソースコードを自動生成」してしまう「blanco Framewo...
- Trac
- struts menuを利用したサンプルリンク集
- 개발 환경 구축 pukiwiki
- pukiwiki intall 1 - php + apache + mysql setup
- pukiwiki
- maven setup
- maven setup
- 第3回Seasar勉強会
- OGNL
- JSON-libでXMLのJSON化
- アノテーションのアノテーション
- s2strutsとsastrutsの違い
-
▼
8月
(28)
マイブログ リスト
![](http://photos1.blogger.com/x/blogger2/3476/938359516391572/240/z/411320/gse_multipart45067.jpg)
Jang ki hote
0 件のコメント:
コメントを投稿