这个问题是前两部分的延续,任何有兴趣看到我来自你的人都可以参考第1部分和第2部分,但没有必要。
write file need to optimised for heavy traffic
Write file need to optimised for heavy traffic part 2
现在我有一个工作片段,相关部分如下:
public static class memoryStreamClass
{
static MemoryStream ms1 = new MemoryStream();
public static void fillBuffer(string outputString)
{
byte[] outputByte = Encoding.ASCII.GetBytes(outputString);
ms1.Write(outputByte, 0, outputByte.Length);
if (ms1.Length > 8100)
{
emptyBuffer(ms1);
ms1.SetLength(0);
ms1.Position = 0;
}
}
static void emptyBuffer(MemoryStream ms)
{
FileStream outStream = new FileStream("c:\\output.txt", FileMode.Append);
ms.WriteTo(outStream);
outStream.Flush();
outStream.Close();
}
以上代码段工作正常,并且没有bug。每次写入时输出大约8KB的数据。
现在我尝试多线程处理上面的代码以增强IO写入瓶颈的性能并出现问题。下面的代码片段是我试图尝试的内容。
基本上我有2个相同的memoryStream,如果说ms1已满,它会将ms1写入文件并在ms1写入时切换到ms2,反之亦然。
public static class memoryStreamClass
{
static MemoryStream ms1 = new MemoryStream();
static MemoryStream ms2 = new MemoryStream();
static int c = 1;
public static 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(ms1));
thread1.Start();
ms1.SetLength(0);
ms1.Position = 0;
}
}
else
{
ms2.Write(outputByte, 0, outputByte.Length);
if (ms2.Length > 8100)
{
c = 1;
Thread thread2 = new Thread(() => emptyBuffer(ms2));
thread2.Start();
ms2.SetLength(0);
ms2.Position = 0;
}
}
}
上面的代码可以编译和运行,但是,输出写入并不总是8KB,并且它写得太频繁(比我的单线程程序)。谁可以启发我,并指出我的程序有什么问题?非常感谢你
答案 0 :(得分:1)
您的代码严重受损,您使用两个缓冲区来提高性能的想法几乎肯定是过度优化。但是,这段代码中存在一个明显的问题:
Thread thread1 = new Thread( () => emptyBuffer(ms1));
thread1.Start();
ms1.SetLength(0);
ms1.Position = 0;
此代码的作用是:
问题是你的“清晰”代码在你的线程有机会启动之前几乎肯定会执行<(因为一般来说,执行方法会在线程上下文改变之前完成)。因此,当您致电emptyBuffer
时,您的MemoryStream
已空。
你的静力学是一个坏主意;如果您要将非静态实例传递给emptyBuffer
方法,然后设置ms1 = new MemoryStream()
,则可能会有更好的功能代码。但最终,这段代码在概念上存在缺陷,你应该考虑重新设计。