今回は約100MBの文字コードMS932で書かれたテキストファイルを読み込んで、中身を別ファイルに書き写す際の処理速度について計測してみました。用意したファイルのサイズ(byte数)は114,999,998です。
BufferedInputStream
無しかつ、バッファサイズ指定無しBufferedInputStream
でラップせずそのまま入出力するパターンです。
Java
System.out.println("スタート(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long startUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
System.out.println("used(start):" + startUsedMemory);
long startTime = System.currentTimeMillis();
Path input = Paths.get("C:\\workspace\\test\\100MBms932.txt");
Path output = Paths.get("C:\\workspace\\test\\result_sample.txt");
//「読み込み用ファイル」と「書き込み用ファイル」を開く
try(InputStream is = Files.newInputStream(input);
OutputStream os = Files.newOutputStream(output);){
//「読み込み用ファイル」からバイトを読み取りを「書き出し用ファイル」にバイトのまま書き出す。
int len = 0;
int roopCnt = 0;
while ((len = is.read()) > 0) {
os.write(len);
roopCnt++;
}
System.out.println("I/O回数:" + roopCnt);
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("ゴール(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long endUsedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("used(end):" + endUsedMemory);
long usedMem = endUsedMemory - startUsedMemory;
System.out.println("実行時間:" + (endTime - startTime) + "ms");
System.out.println("使用メモリ増加量(総量MB):" + (usedMem /1024/1024));
上記のコードを5回試した結果は次のとおりです。
項目 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|
スタート(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(start) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
I/O回数 | 114999998 | 114999998 | 114999998 | 114999998 | 114999998 |
ゴール(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(end) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
実行時間 | 745564ms | 742157ms | 749027ms | 747909ms | 743747ms |
使用メモリ増加量(総量MB) | 0 | 0 | 0 | 0 | 0 |
BufferedInputStream
有りかつ、バッファサイズ指定無しBufferedInputStream
でラップしてそのまま入出力するパターンです。
Java
System.out.println("スタート(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long startUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
System.out.println("used(start):" + startUsedMemory);
long startTime = System.currentTimeMillis();
Path input = Paths.get("C:\\workspace\\test\\100MBms932.txt");
Path output = Paths.get("C:\\workspace\\test\\result_sample.txt");
//「読み込み用ファイル」と「書き込み用ファイル」を開く
try(InputStream is = Files.newInputStream(input);
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os = Files.newOutputStream(output);
BufferedOutputStream bos = new BufferedOutputStream(os);){
//「読み込み用ファイル」からバイトを読み取りを「書き出し用ファイル」にバイトのまま書き出す。
int len = 0;
int roopCnt = 0;
while ((len = bis.read()) > 0) {
bos.write(len);
roopCnt++;
}
System.out.println("I/O回数:" + roopCnt);
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("ゴール(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long endUsedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("used(end):" + endUsedMemory);
long usedMem = endUsedMemory - startUsedMemory;
System.out.println("実行時間:" + (endTime - startTime) + "ms");
System.out.println("使用メモリ増加量(総量MB):" + (usedMem /1024/1024));
上記のコードを5回試した結果は次のとおりです。
項目 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|
スタート(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(start) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
I/O回数 | 114999998 | 114999998 | 114999998 | 114999998 | 114999998 |
ゴール(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(end) | 2726512 | 2726512 | 2726560 | 2726560 | 2726512 |
実行時間 | 5264ms | 4907ms | 5046ms | 5593ms | 5413ms |
使用メモリ増加量(総量MB) | 0 | 0 | 0 | 0 | 0 |
BufferedInputStream
無しかつ、バッファサイズ指定有りBufferedInputStream
でラップせずに、バッファサイズを指定して実行するパターンです。
Java
System.out.println("スタート(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long startUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
System.out.println("used(start):" + startUsedMemory);
long startTime = System.currentTimeMillis();
Path input = Paths.get("C:\\workspace\\test\\100MBms932.txt");
Path output = Paths.get("C:\\workspace\\test\\result_sample.txt");
//「読み込み用ファイル」と「書き込み用ファイル」を開く
try(InputStream is = Files.newInputStream(input);
OutputStream os = Files.newOutputStream(output);){
//「読み込み用ファイル」からバイトを読み取りを「書き出し用ファイル」にバイトのまま書き出す。
byte[] buf = new byte[1024];
int len = 0;
int roopCnt = 0;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
roopCnt++;
}
System.out.println("I/O回数:" + roopCnt);
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("ゴール(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long endUsedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("used(end):" + endUsedMemory);
long usedMem = endUsedMemory - startUsedMemory;
System.out.println("実行時間:" + (endTime - startTime) + "ms");
System.out.println("使用メモリ増加量(総量MB):" + (usedMem /1024/1024));
上記のコードを5回試した結果は次のとおりです。
項目 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|
スタート(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(start) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
I/O回数 | 112305 | 112305 | 112305 | 112305 | 112305 |
ゴール(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(end) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
実行時間 | 1253ms | 1355ms | 1545ms | 1413ms | 1527ms |
使用メモリ増加量(総量MB) | 0 | 0 | 0 | 0 | 0 |
BufferedInputStream
有りかつ、バッファサイズ指定有りBufferedInputStream
でラップして、さらにバッファサイズも指定して実行するパターンです。
Java
System.out.println("スタート(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long startUsedMemory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
System.out.println("used(start):" + startUsedMemory);
long startTime = System.currentTimeMillis();
Path input = Paths.get("C:\\workspace\\test\\100MBms932.txt");
Path output = Paths.get("C:\\workspace\\test\\result_sample.txt");
//「読み込み用ファイル」と「書き込み用ファイル」を開く
try(InputStream is = Files.newInputStream(input);
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os = Files.newOutputStream(output);
BufferedOutputStream bos = new BufferedOutputStream(os);){
//「読み込み用ファイル」からバイトを読み取りを「書き出し用ファイル」にバイトのまま書き出す。
int len = 0;
byte[] buf = new byte[1024];
int roopCnt = 0;
while ((len = bis.read(buf)) > 0) {
bos.write(buf,0,len);
roopCnt++;
}
System.out.println("I/O回数:" + roopCnt);
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("ゴール(総量MB):" + (Runtime.getRuntime().totalMemory()/1024/1204));
long endUsedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("used(end):" + endUsedMemory);
long usedMem = endUsedMemory - startUsedMemory;
System.out.println("実行時間:" + (endTime - startTime) + "ms");
System.out.println("使用メモリ増加量(総量MB):" + (usedMem /1024/1024));
上記のコードを5回試した結果は次のとおりです。
項目 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|
スタート(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(start) | 2044920 | 2044920 | 2044920 | 2044920 | 2044920 |
I/O回数 | 112305 | 112305 | 112305 | 112305 | 112305 |
ゴール(総量MB) | 104 | 104 | 104 | 104 | 104 |
used(end) | 2726576 | 2726576 | 2726576 | 2726576 | 2726576 |
実行時間 | 505ms | 535ms | 515ms | 717ms | 611ms |
使用メモリ増加量(総量MB) | 0 | 0 | 0 | 0 | 0 |
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!