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

时间:2012-07-18 10:38:52

标签: c# multithreading performance io

这是第3部分的延续

Write file need to optimised for heavy traffic part 3

因为我的代码有所改变,我认为打开一个新线程会更好。

    public class memoryStreamClass
    {
        static MemoryStream ms1 = new MemoryStream();
        static MemoryStream ms2 = new MemoryStream();
        static int c = 1;

        public 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(ref ms1));
                    thread1.Start();
                }
            }
            else
            {
                ms2.Write(outputByte, 0, outputByte.Length);

                if (ms2.Length > 8100)
                {
                    c = 1;

                    Thread thread2 = new Thread(() => emptyBuffer(ref ms2));
                    thread2.Start();
                }
            }
        }

        void emptyBuffer(ref MemoryStream ms)
        {
            FileStream outStream = new FileStream(string.Format("c:\\output.txt", FileMode.Append);

            ms.WriteTo(outStream);
            outStream.Flush();
            outStream.Close();

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

            Console.WriteLine(ms.Position);
        }

我改变了2件事,改变了第3部分的代码。

  1. 将类和方法更改为非静态,变量仍然是静态的。
  2. 我已经将memorystream重置长度移动到emptyBuffer方法中,并且我使用ref参数将引用而不是副本传递给方法。
  3. 此代码编译正常并运行正常。但是,我使用单线程程序并行运行,使用2台计算机,一台计算机运行单线程,一台计算机在同一网络上运行多线程版本。我跑了大约5分钟。而单线程版本收集8333KB数据而多线程版本只收集8222KB数据。 (单线程版本的98.6%)

    我第一次在2版本之间进行任何性能比较。也许应该运行更多的测试来确认它。但基于查看代码,那里的任何大师会指出任何问题?

    我目前还没有在锁或线程池上放任何代码,也许我应该,但如果代码运行正常,我不想改变它并打破它。我唯一要改变的是缓冲区大小,所以我将消除缓冲区填充之前清除其他缓冲区的任何可能性。

    对我的代码有任何意见吗?

1 个答案:

答案 0 :(得分:0)

问题仍然是静态。您正在清除可能包含未写入磁盘的数据的缓冲区。

我认为这种情况发生在1.4%的时间。

ms1 fills up, empty buffer1 thread started, switch to ms2
empty buffer1 is writing to disk
ms2 fills up, empty buffer2 thread started, switch to ms1
empty buffer1 to disk finishes
ms1 is cleared while it is the active stream

进行多线程编程时,静态很好,但静态状态不是。理想情况下,线程之间没有共享内存,您的代码完全依赖于它。

以这种方式思考 - 如果你期望值不断变化,那么它是不是static呢?