这是第 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 件事。
- 类和方法更改为非静态,变量仍然是静态的。
- 我已将 memorystream 重置长度移动到 emptyBuffer 方法中,并且我使用 ref 参数将引用而不是副本传递给该方法。
这段代码编译得很好并且运行正常。但是,我与我的单线程程序并排运行它,使用 2 台计算机,一台计算机运行单线程,一台计算机运行多线程版本,在同一个网络上。我运行它大约 5 分钟。单线程版本收集了 8333KB 的数据,而多线程版本只收集了 8222KB 的数据。(单线程版本的98.6%)
这是我第一次在 2 版本之间进行任何性能比较。也许应该运行更多测试来确认它。但是基于查看代码,那里的任何大师都会指出任何问题?
我目前没有在锁或线程池上放置任何代码,也许我应该,但如果代码运行良好,我不想更改它并破坏它。我唯一要改变的是缓冲区大小,所以我会在另一个缓冲区清空之前消除缓冲区填满的任何机会。
对我的代码有任何评论吗?