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();
           }
       }
    }
 }

编辑:

代码现在应该编译。

新观察:

如果我在“发布”(而不是调试)中进行编译,则问题消失且结果有意义当使用 W2008 在服务器上(而不是使用 W7 在 PC 上)运行代码时,问题消失且结果有意义

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 回答