FileStream.Write 関数の使用中にパフォーマンスの問題に直面しています。
StreamReader オブジェクトを使用してファイル (~ サイズは 400 KB) から Base64 文字列を読み取るために使用するコンソール アプリケーションがあります。Convert.FromBase64String を使用して、この文字列をバイト配列に変換します。次に、FileStream オブジェクトを使用して、このバイト配列をファイルに書き込みます。ここで得られたバイト配列の長さは 334991 でした。
バイト配列の書き込みにかかる時間を測定したところ、約0.116 秒でした。
楽しみのために、ASCIIEncoding.GetBytes 関数を使用して、同じ Base64 でエンコードされた文字列からバイト配列を取得しました (これでは正しい DECODED 出力が得られないことはわかっていましたが、試してみたかっただけです)。FileStream オブジェクトを使用して、このバイト配列をファイルに書き込みました。ここで得られたバイト配列の長さは 458414 でした。
この方法論を使用してバイト配列の書き込みにかかる時間を測定したところ、約0.008 秒であることがわかりました。
サンプルコードは次のとおりです。
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
TimeSpan executionTime;
StreamReader sr = new StreamReader("foo.txt");
string sampleString = sr.ReadToEnd();
sr.Close();
////1. Convert to bytes using Base64 Decoder (The real output!)
//byte[] binaryData = Convert.FromBase64String(sampleString);
//2. Convert to bytes using AsciiEncoding (Just for Fun!)
byte[] binaryData = new System.Text.ASCIIEncoding().GetBytes(sampleString);
Console.WriteLine("Byte Length: " + binaryData.Length);
stopWatch.Start();
FileStream fs = new FileStream("bar.txt", FileMode.Create, FileAccess.Write);
fs.Write(binaryData, 0, binaryData.Length);
fs.Flush();
fs.Close();
stopWatch.Stop();
executionTime = stopWatch.Elapsed;
Console.WriteLine("FileStream Write - Total Execution Time: " + executionTime.TotalSeconds.ToString());
Console.Read();
}
}
Base64 でエンコードされた文字列を含む約 5000 個のファイルに対してテストを実行しましたが、これら 2 種類のバイト配列の書き込みにかかる時間の差はほぼ 10 倍です ( 実際のデコードを使用してバイト配列を書き込む方が時間がかかります)。
Convert.FromBase64String を使用して取得したバイト配列の長さは、ASCIIEncoding.GetBytes 関数を使用して取得したものよりも短くなっています。
私がやろうとしているのは、FileStream オブジェクトを使用して大量のバイトを書き込むことだけなのだろうか。では、バイト配列をディスクに書き込む際に、なぜこのような大幅なパフォーマンスの違い (書き込み時間) が発生するのでしょうか?
それとも、私は何かひどく間違ったことをしていますか? お知らせ下さい。