【问题标题】:Write file need to optimised for heavy traffic part 4写入文件需要针对大流量进行优化第 4 部分
【发布时间】:2012-07-17 09:01:09
【问题描述】:

这是第三部分的延续

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

与第 3 部分中的代码相比,我更改了 2 件事。

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

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

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

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

我的代码中有任何 cmets 吗?

【问题讨论】:

  • 我查看了这个问题的所有先前部分,看起来您没有实际问题。您只是预测一个问题并尝试先发制人地解决它。首先,以最简单的形式实现它,查明“实际”问题,从中导出需求并尝试满足该需求。解决问题会容易得多,因为 SO 用户将有更大的想法空间。

标签: c# multithreading performance io


【解决方案1】:

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

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

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

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

这样想——如果您期望一个值不断变化,那不完全是static 是吗?

【讨论】:

  • 我有一个印象,如果我的变量不是静态的,它每次都会得到一个新的,所以我无法填满我的内存流并将它输出到文件中,我错了吗?
  • 我将变量更改为非静态变量,我根本无法执行写入,我猜该变量每次都会重新声明并且永远不会填满,因此永远不会写入文件。我尝试更改缓冲区大小,看看性能是否有所提高
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多