这是第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部分的代码。
此代码编译正常并运行正常。但是,我使用单线程程序并行运行,使用2台计算机,一台计算机运行单线程,一台计算机在同一网络上运行多线程版本。我跑了大约5分钟。而单线程版本收集8333KB数据而多线程版本只收集8222KB数据。 (单线程版本的98.6%)
我第一次在2版本之间进行任何性能比较。也许应该运行更多的测试来确认它。但基于查看代码,那里的任何大师会指出任何问题?
我目前还没有在锁或线程池上放任何代码,也许我应该,但如果代码运行正常,我不想改变它并打破它。我唯一要改变的是缓冲区大小,所以我将消除缓冲区填充之前清除其他缓冲区的任何可能性。
对我的代码有任何意见吗?
答案 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呢?