お久しぶりです、エンジニアのMasashiです。
前回記事(【C#】ファイル書き込み速度比較)ではtxtファイルの書き込み速度について比較を行いましたが、今回はcsvファイルでは速度差がどうなるのか比較を行いたいと思います。
ファイル形式で書き込み速度に変化が生じるというのは、今までソースコードを書いてきて感じたことはないため特に面白い結果にはならないと思いますが、確認してみたいと思います。
今回もファイルの書き込みを行う関数の速度を4つの方法から検証してみたいと思います。
測定までの流れ
今回測定を行うのは、【0,1,2,3,4,5,6,7,8,9,】という文字列を500,000回、
csv形式で書き込むまでに要した時間になります。
比較対象としてStreamWriterをtry~finallyの形で記載したもの、StreamWriterをusingを使用して記載したもの、AppendAllTextを使用、WriteAllLinesを使用の4つの場合について検証しています。
AppendAllTextについては、毎回ファイルのオープン・クローズが走ることで速度が
どの程度遅くなってしまうのかを計測するために、Loop内で使用するという間違った使い方で計測しています。
測定環境
- CPU:Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (4 CPUs), ~2.9GHz
- メモリ:16GB
- Visual Studio 2015
対象データ
- 書き込む文字列:0,1,2,3,4,5,6,7,8,9,
- 書き込む回数:500,000
- ファイル形式:csv形式
測定対象
- StreamWriterをtry~finallyで記載
- StreamWriterをusingを使用して記載
- AppendAllTextを使用
- WriteAllLinesを使用
テストコード
ファイル書き込み速度の測定結果
10回試行した結果の平均値が下記になっています。小数点第1位で四捨五入しています。
計測項目 | 計測時間(ms) |
---|---|
StreamWriterをtry~finallyで記載 | 127 |
StreamWriterをusingを使用して記載 | 120 |
AppendAllTextを使用 | 測定不能 |
WriteAllLinesを使用 | 164 |
結果の比較の前にAppendAllTextを使用したパターンですが前回同様、毎回ファイルのオープン・クローズを行うため、結果の取得に非常に時間がかかり、計測することを諦めたため、計測不能という形で記載させていただきました。
結果も前回同様非常に似通っており、StreamWriterを使用したパターンよりusingを使用したほうが若干ですが早くなっています。
また、前回よりも全体的に速度が遅い状態で結果は出ていますが、純粋に「,」が文字として増えているため、その分の時間が計測結果の時間に現れたと考えられます。
ファイル書き込み速度のまとめ
結論につきましては、前回と同様になってしまいますが、再度載せさせていただきます。
AppendAllTextを使用する場合は、データを加工してから使用することで、ファイルのオープン・クローズ処理を意識する必要がないため非常に便利です。
StreamWriterを使用する場合は、非常に小さい値ですが速度差が生まれるため、usingを使用して実装するのがいいかと思います。
またusingを使用することでClose処理を意識しなくてすむため、finallyでClose処理を入れることを忘れていたようなバグを防ぐことができます。
WriteAllLinesを使用する場合は、改行を入れる処理を意識しなくていいため、取得したデータを改行して書き込んでほしいという要望がある場合は使用することになると思います。
今回の計測によりファイルの違いでは、速度差を見つけることができませんでした。よってファイルの拡張子が異なっていたとしても状況に応じて使用する関数を変更して問題ないと考えられます。
この記事が少しでも皆さんのお役に立てば幸いです。