1

这是第 3 部分的延续

写入文件需要针对大流量进行优化第 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);
        }

我从第 3 部分中的代码更改了 2 件事。

  1. 类和方法更改为非静态,变量仍然是静态的。
  2. 我已将 memorystream 重置长度移动到 emptyBuffer 方法中,并且我使用 ref 参数将引用而不是副本传递给该方法。

这段代码编译得很好并且运行正常。但是,我与我的单线程程序并排运行它,使用 2 台计算机,一台计算机运行单线程,一台计算机运行多线程版本,在同一个网络上。我运行它大约 5 分钟。单线程版本收集了 8333KB 的数据,而多线程版本只收集了 8222KB 的数据。(单线程版本的98.6%)

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

我目前没有在锁或线程池上放置任何代码,也许我应该,但如果代码运行良好,我不想更改它并破坏它。我唯一要改变的是缓冲区大小,所以我会在另一个缓冲区清空之前消除缓冲区填满的任何机会。

对我的代码有任何评论吗?

4

1 回答 1

0

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

我想这种情况发生的概率为 1.4%。

ms1 填满,清空 buffer1 线程启动,切换到 ms2
空缓冲区 1 正在写入磁盘
ms2 填满,清空 buffer2 线程启动,切换到 ms1
清空 buffer1 到磁盘完成
ms1 在它是活动流时被清除

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

这样想——如果你期望一个值持续变化,它不完全是静态的,不是吗?

于 2012-07-18T15:14:30.367 回答