これはpart3の続きです
大量のトラフィックに最適化する必要がある書き込みファイル パート 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 つあります。
- クラスとメソッドは非静的に変更され、変数は依然として静的です。
- メモリストリームのリセット長を emptyBuffer メソッドに移動し、ref パラメータを使用して、コピーの代わりに参照をメソッドに渡します。
このコードは正常にコンパイルされ、正常に実行されます。ただし、同じネットワーク上で 2 台のコンピューターを使用して、1 台のコンピューターでシングル スレッド バージョンを実行し、1 台のコンピューターでマルチスレッド バージョンを実行して、シングル スレッド プログラムと並行して実行します。私はそれを約5分間実行します。シングル スレッド バージョンは 8333KB のデータを収集しますが、マルチスレッド バージョンは 8222KB のデータしか収集しません。(シングルスレッドバージョンの 98.6%)
初めて 2 つのバージョン間でパフォーマンスを比較しました。おそらく、それを確認するためにさらにテストを実行する必要があります。しかし、コードを見ることに基づいて、そこにいるマスターは何か問題を指摘しますか?
現時点では、コードをロックまたはスレッドプールに配置していません。おそらくそうすべきですが、コードが正常に実行される場合は、変更して壊したくありません。私が変更するのはバッファサイズだけなので、他のバッファが空になる前にバッファがいっぱいになる可能性を排除します。
私のコードに関するコメントはありますか?