2

これは、以前の質問Log to memory and then write to file への参照です。実際には、その質問の編集部分です。編集部分で、メモリに書き込むとファイルに書き込むよりも高速になるかどうかを尋ねました。簡単なテストを行ったところ、衝撃的な結果が得られました。コミュニティと共有したかったのです。だからここにコードがあります

private void Button1Click(object sender, EventArgs e)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    File.AppendAllText(@"D:\File1.txt", string.Format("{0}Start! : {1}", Environment.NewLine, DateTime.Now.ToString(CultureInfo.InvariantCulture)));
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 1000000; j++)
        {
             File.AppendAllText(@"D:\File1.txt", string.Format("{0}{1}:{2}", Environment.NewLine, i.ToString(CultureInfo.InvariantCulture), j.ToString(CultureInfo.InvariantCulture)));
         }
    }
    File.AppendAllText(@"D:\File1.txt", string.Format("{0}Done!{1}", Environment.NewLine, DateTime.Now.ToString(CultureInfo.InvariantCulture)));
    stopwatch.Stop();
    File.AppendAllText(@"D:\File1.txt",
                       string.Format("{0}{1}:{2}",Environment.NewLine,              stopwatch.Elapsed.ToString(), stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture)));
    MessageBox.Show("Done!");
}

private void Button2Click(object sender, EventArgs e)
{
     var stopwatch = new Stopwatch();
     using (var mem = new MemoryStream())
     {
         using (var binaryWriter = new BinaryWriter(mem))
         {
             stopwatch.Start();
             {
                 binaryWriter.Write("start! : " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
                 for (int i = 0; i < 6; i++)
                 {
                     for (int j = 0; j < 1000000; j++)
                     {
                         binaryWriter.Write(i.ToString(CultureInfo.InvariantCulture) + ":" + j.ToString(CultureInfo.InvariantCulture));
                     }
                 }
                 stopwatch.Stop();
                 binaryWriter.Write("Done! " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
                 binaryWriter.Write(stopwatch.Elapsed.ToString() + ":" + stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture));
                 binaryWriter.Flush();
                 var file = new FileStream(@"D:\File2.txt", FileMode.Create);
                 mem.WriteTo(file);
             }
         }
     }
     MessageBox.Show("Done!");
}

コードは理解しやすいはずなので

性能比較

Elapsed time in File1.txt = 00:50:24.5654918  
Elapsed milliseconds in File1.txt = 3024565  
Elapsed time in File2.txt = 00:00:04.7430152  
Elapsed milliseconds in File2.txt = 4743

というわけで、ご覧の通り約50分の差があります!これは、メモリ ストリームやログ記録用のカスタム ツールを使用せずにすべてを IO ファイルに直接記録すると、パフォーマンスが低下する本当の原因になる可能性があります。秒。( Windows エクスプローラーに表示される時間が、stopwatch.ShowElapasedTime によって最後にファイルに表示される時間と一致しない理由についてはまだ混乱していますが、それでも、Windows エクスプローラーの時間が表示されていても、約 45 分速いです! )だから、これは本当に便利なものになる可能性があるので、共有することを考えました!

4

1 に答える 1

3

これは、File.AppendAllText がファイルを開き、書き込み、バッファーをフラッシュしてから閉じるためです。ログ ファイルを開いたままにして、(MemoryStream の代わりに) ストリームを使用して書き込みを行うと、MemoryStream で見た結果に非常に近い結果が得られます。

やってみて。

于 2012-06-10T04:26:17.493 に答える