【C#】ファイル読み取り速度比較

お久しぶりです、エンジニアのMasashiです。

今回は、ファイルの内容を読み取る際の速度について検証を行ってみます。
ファイルの内容を読み取る際に使用できる関数はいくつかあり、
取得したいデータの形(文字列または配列等)を意識して使用する関数を変えているかと思います。
下記では、データの形は気にせずにファイルの内容を読み取る際の速度に違いがあるのか検証を行ってみます。

測定までの流れ

今回測定を行うのは、ファイルに乱数を100,000行記載を行いファイルの内容を読み込むまでに要した時間になります。
比較対象としてStreamReaderを使用して一括で読み込む場合と1行ずつ読み込む場合、
FileクラスのReadAllText、ReadAllLinesを使用した場合の4つについてtxt形式とcsv形式それぞれで速度を検証しています。

測定環境

  • Visual Studio 2015

対象データ

  • テキストに書き込む数値の数:100,000
  • テキストに書き込む数値の内容:0~99,999までの乱数

測定対象

  • txt形式のファイルにStreamReader.ReadToEndを使用して一括読み込み
  • txt形式のファイルにStreamReader.ReadLineを使用して1行ずつ読み込み
  • txt形式のファイルにFile.ReadAllTextを使用して読み込み
  • txt形式のファイルにFile.ReadAllLinesを使用して読み込み
  • csv形式のファイルにStreamReader.ReadToEndを使用して一括読み込み
  • csv形式のファイルにStreamReader.ReadLineを使用して1行ずつ読み込み
  • csv形式のファイルにFile.ReadAllTextを使用して読み込み
  • csv形式のファイルにFile.ReadAllLinesを使用して読み込み

テストコード

ファイル読み込みの測定結果

10回試行した結果の平均値が下記になっています。小数点第2位で四捨五入しています。

計測項目 計測時間(ms)
txt形式のファイルにStreamReader.ReadToEndを使用して一括読み込み 5.8
txt形式のファイルにStreamReader.ReadLineを使用して1行ずつ読み込み 10.0
txt形式のファイルにFile.ReadAllTextを使用して読み込み 3.1
txt形式のファイルにFile.ReadAllLinesを使用して読み込み 11.4
csv形式のファイルにStreamReader.ReadToEndを使用して一括読み込み 5.1
csv形式のファイルにStreamReader.ReadLineを使用して1行ずつ読み込み 10.8
csv形式のファイルにFile.ReadAllTextを使用して読み込み 4.7
csv形式のファイルにFile.ReadAllLinesを使用して読み込み 11.8

上記の結果を比較してみるとファイル形式の違いによる速度差については見られませんでした。
次に使用している関数別にみてみると一番速い形は、File.ReadAllTextを使用したパターンになりました。
StreamReader.ReadToEndと返り値の型や処理の流れは同一だと考えていましたが、
txt形式・csv形式どちらでもFile.ReadAllTextを使用した方が速いため、速度差の原因がどこにあるのか調査してみたいと思います。
StreamReader.ReadLineを使用して1行ずつ読み込むパターンは上記のパターンと比べると1行ずつ読み込む方法のため時間がかかる結果になりました。
File.ReadAllLinesは返り値が文字列の配列形式であるため、配列形式に合わせて格納する時間が処理時間として出ていると考えられます。

まとめ

ファイル読み込みの速度では、File.ReadAllTextが一番速い結果となりました。
結果を文字列形式で受け取れれば構わない場合は、File.ReadAllTextを使用することが一番いいと考えられます。
また、File.ReadAllLinesに関しては時間を比較した場合遅いですが、結果を配列で返却してくれるため、
データの加工が行いやすいメリットがあります。
処理時間もそこまで大きな差ではないため、返り値の型に応じて使用する関数を柔軟に変えて問題ないと思います。
この記事が少しでも皆さんのお役に立てば幸いです。

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP