1

パフォーマンスへの影響を確認するためにメモリ マップト ファイルを調べたところ、ファイルに書き込むたびに BinaryWriter を再作成すると、コードの実行速度が 30% 速くなることがわかりました。

誰か説明がありますか?

このコードは、以下のコードよりも 30% 高速に実行されます。

 using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("testmap", 1000000000))
 {
    DateTime dt;
    bool mutexCreated;
    Mutex mutex = new Mutex(false, "testmapmutex", out mutexCreated);
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
       dt = DateTime.Now;
       for (int i = 0; i < 1000000; i++)
       {
           BinaryWriter writer = new BinaryWriter(stream); // In or out?
           try
           {
               mutex.WaitOne();
               writer.Write(i);
               mutex.ReleaseMutex();
           }
       }
    }
 }

このコードは、上記のコードよりも 30% 遅く実行されます。

 using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("testmap", 1000000000))
 {
    DateTime dt;
    bool mutexCreated;
    Mutex mutex = new Mutex(false, "testmapmutex", out mutexCreated);
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
       dt = DateTime.Now;
       BinaryWriter writer = new BinaryWriter(stream); // In or out?
       for (int i = 0; i < 1000000; i++)
       {
           try
           {
               mutex.WaitOne();
               writer.Write(i);
               mutex.ReleaseMutex();
           }
       }
    }
 }

編集:

コードは今すぐコンパイルする必要があります。

新しい観測:

「リリース」(代わりにデバッグ) でコンパイルしている場合、問題はなくなり、結果は理にかなっています (W7 を使用する PC ではなく) W2008 を使用するサーバーでコードを実行すると、問題はなくなり、結果は理にかなっています

4

1 に答える 1

2

コードをテストしましたが、次のように実行されます。System.Diagnostics.Stopwatch経過時間を測定するために使用されます。

BinaryWriterループ内: 4815537ティック BinaryWriterループ外: 4168415ティック

これは、予期される正常な動作です。

しかしBinaryWriter、ループ内でインスタンス化した後に破棄していないためfor、重大な間違いを犯していると言われています。その間違いを修正すると、コードは実行されません

不正なコード

for (int i = 0; i < 1000000; i++)
{
   using (BinaryWriter writer = new BinaryWriter(stream)) 
   // this will force disposing of writer, but will also close the base 
   // stream instance too. 
   {
           // In or out?
           try
           {
              mutex.WaitOne();
              writer.Write(i);
              mutex.ReleaseMutex();
           }
           catch (Exception e)
           {
               Console.WriteLine(e);
           }
    }
 }
于 2012-07-01T09:27:11.670 に答える