FileStreamとManifestResourceStream
全く同じ内容のXMLを用いて、通常のファイルとマニフェストリソースの2通りを用意して、以下のコードをそれぞれ実行してみる。
Stream stream = null; #if FILEIO //ファイル stream = new FileStream(path, FileMode.Open, FileAccess.Read); #else //マニフェストストリーム stream = Assembly.GetEntryAssembly().GetManifestResourceStream(path); #endif using (stream) { long start = System.Environment.TickCount; using (StreamReader reader = new StreamReader(stream)) { string line; while ((line = reader.ReadLine()) != null) { System.Console.WriteLine(line); } } long end = System.Environment.TickCount - start; System.Console.WriteLine(end+"msec."); }
マニフェストリソースは単なるメモリI/Oなので、O/Sの配下にあるFileのI/Oよりずっと速いと思ったのだが、実際には測定誤差程度の差しか出ない。殆ど同じ時間で処理が終了するのだ。メモリI/Oじゃないのか? マップドファイル使ってるのか?
.NETにはこのような不思議(私が不思議だと思っているだけかもしれない)があるのだが、実装云々に言及するのは無理なので、MONOのソースでも見てみようかな。
追記
テストに使用したファイルのサイズに問題があったのかもしれない。それほど大きいサイズではないのでメモリに乗っかった可能性がある。その場合、リソースと処理速度が変らなくても何ら不思議では無い。キャッシュされない大きいサイズのファイルで追試が必要だ。