今回は約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がオススメ!同僚に差をつけよう!