写文件需要针对繁重的流量第3部分进行优化

这个问题是前两部分的延续,任何有兴趣看到我来自你的人都可以参考第1部分和第2部分,但没有必要。

写文件需要针对繁重的流量进行优化

写文件需要针对繁重的流量第2部分进行优化

现在我有一个工作片段,相关部分如下:

public static class memoryStreamClass { static MemoryStream ms1 = new MemoryStream(); public static void fillBuffer(string outputString) { byte[] outputByte = Encoding.ASCII.GetBytes(outputString); ms1.Write(outputByte, 0, outputByte.Length); if (ms1.Length > 8100) { emptyBuffer(ms1); ms1.SetLength(0); ms1.Position = 0; } } static void emptyBuffer(MemoryStream ms) { FileStream outStream = new FileStream("c:\\output.txt", FileMode.Append); ms.WriteTo(outStream); outStream.Flush(); outStream.Close(); } 

上面的代码片段工作正常,并且没有bug。 每次写入时输出大约8KB的数据。

现在我尝试multithreading上面的代码来增强IO写入瓶颈的性能并出现问题。 下面的片段是我试图尝试的。

基本上我有2个相同的memoryStream,如果说ms1已满,它将ms1写入文件并在ms1写入时切换到ms2,反之亦然。

  public static class memoryStreamClass { static MemoryStream ms1 = new MemoryStream(); static MemoryStream ms2 = new MemoryStream(); static int c = 1; public static void fillBuffer(string outputString) { byte[] outputByte = Encoding.ASCII.GetBytes(outputString); if (c == 1) { ms1.Write(outputByte, 0, outputByte.Length); if (ms1.Length > 8100) { c = 2; Thread thread1 = new Thread( () => emptyBuffer(ms1)); thread1.Start(); ms1.SetLength(0); ms1.Position = 0; } } else { ms2.Write(outputByte, 0, outputByte.Length); if (ms2.Length > 8100) { c = 1; Thread thread2 = new Thread(() => emptyBuffer(ms2)); thread2.Start(); ms2.SetLength(0); ms2.Position = 0; } } } 

上面的代码可以编译和运行,但是,输出写入并不总是8KB,并且它写得太频繁(比我的单线程程序)。 谁可以启发我,并指出我的程序有什么问题? 非常感谢你

您的代码被严重破坏,您使用两个缓冲区来提高性能的想法几乎肯定是过度优化。 但是,这段代码中存在一个明显的问题:

 Thread thread1 = new Thread( () => emptyBuffer(ms1)); thread1.Start(); ms1.SetLength(0); ms1.Position = 0; 

这段代码的作用是:

  • 启动一个线程来处理缓冲区
  • 立即清除缓冲区

问题是你的“清晰”代码几乎肯定会在你的线程有机会启动之前执行(因为一般来说,执行方法将在线程上下文改变之前完成)。 因此,当您调用emptyBuffer ,您的MemoryStream已经为空。

你的静力学是一个坏主意; 如果你要将一个非静态实例传递给emptyBuffer方法,然后设置ms1 = new MemoryStream() ,你可能会有更好的代码。 但最终,这段代码在概念上存在缺陷,你应该考虑重新设计。