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

时间:2012-07-17 16:28:09

标签: c# multithreading performance io

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

write file need to optimised for heavy traffic

Write file need to optimised for heavy traffic part 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的数据。

现在我尝试多线程处理上面的代码以增强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,并且它写得太频繁(比我的单线程程序)。谁可以启发我,并指出我的程序有什么问题?非常感谢你

1 个答案:

答案 0 :(得分:1)

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

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

ms1.SetLength(0);
ms1.Position = 0;

此代码的作用是:

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

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

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