1

これは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 つあります。

  1. クラスとメソッドは非静的に変更され、変数は依然として静的です。
  2. メモリストリームのリセット長を emptyBuffer メソッドに移動し、ref パラメータを使用して、コピーの代わりに参照をメソッドに渡します。

このコードは正常にコンパイルされ、正常に実行されます。ただし、同じネットワーク上で 2 台のコンピューターを使用して、1 台のコンピューターでシングル スレッド バージョンを実行し、1 台のコンピューターでマルチスレッド バージョンを実行して、シングル スレッド プログラムと並行して実行します。私はそれを約5分間実行します。シングル スレッド バージョンは 8333KB のデータを収集しますが、マルチスレッド バージョンは 8222KB のデータしか収集しません。(シングルスレッドバージョンの 98.6%)

初めて 2 つのバージョン間でパフォーマンスを比較しました。おそらく、それを確認するためにさらにテストを実行する必要があります。しかし、コードを見ることに基づいて、そこにいるマスターは何か問題を指摘しますか?

現時点では、コードをロックまたはスレッドプールに配置していません。おそらくそうすべきですが、コードが正常に実行される場合は、変更して壊したくありません。私が変更するのはバッファサイズだけなので、他のバッファが空になる前にバッファがいっぱいになる可能性を排除します。

私のコードに関するコメントはありますか?

4

1 に答える 1

0

問題はまだ静的な状態です。ディスクに書き込まれていないデータが含まれている可能性のあるバッファーをクリアしています。

このシナリオは 1.4% の確率で発生していると思います。

ms1 がいっぱいになり、空の buffer1 スレッドが開始され、ms2 に切り替えます
空の buffer1 がディスクに書き込んでいます
ms2 がいっぱいになり、空の buffer2 スレッドが開始され、ms1 に切り替えます
空の buffer1 からディスクへの転送が終了しました
ms1 は、アクティブなストリームである間にクリアされます

マルチスレッド プログラミングを行う場合、静的クラスは問題ありませんが、静的状態はそうではありません。理想的には、スレッド間で共有メモリがなく、コードがそれに完全に依存しています。

このように考えてみてください。値が一貫して変化することを期待している場合、それは厳密には静的ではありませんか?

于 2012-07-18T15:14:30.367 に答える