3

ローカルでホストされている WCF サービスがあり、渡した文字列値を返す基本的なメソッドを公開しています。

また、サービスを 10000 回呼び出して、呼び出しが完了するまでの時間を監視する単体テストもあります。

私のテストでの using ステートメントの位置は重要であり、間違って配置すると大きな違いが生じますが、なぜこれが起こるのかわかりません。

例 1: (35 秒)

    [TestMethod]
    public void TestGetDataOutsideUsing()
    {
        const int count = 10000;
        var operations = new List<int>();
        for (var i = 0; i < count; i++)
            operations.Add(i);
        using (var proxy = new BasicHttpServiceClient())
        {
            var timer = Stopwatch.StartNew();
            System.Threading.Tasks.Parallel.ForEach(operations, x => { proxy.GetData(x.ToString(CultureInfo.InvariantCulture)); });
            timer.Stop();
            Console.WriteLine("{0:###0.0000000} ms", timer.ElapsedMilliseconds);
            Console.WriteLine("{0:###0.0000000} per millisecond", (count / (decimal)timer.ElapsedMilliseconds));
            Console.WriteLine("{0:###0.0000000} per second", (count / ((decimal)timer.ElapsedMilliseconds / 1000)));
            Console.WriteLine("{0:###0.0000000} per minute", (count / ((decimal)timer.ElapsedMilliseconds / 1000 / 60)));
        }
    }

例 2: (6.2 秒)

    [TestMethod]
    public void TestGetDataInsideUsing()
    {
        const int count = 10000;
        var operations = new List<int>();
        for (var i = 0; i < count; i++)
            operations.Add(i);
        var timer = Stopwatch.StartNew();
        System.Threading.Tasks.Parallel.ForEach(operations, x =>
            {
                using (var proxy = new BasicHttpServiceClient())
                {
                    proxy.GetData(x.ToString(CultureInfo.InvariantCulture));
                }
            });
        timer.Stop();
        Console.WriteLine("{0:###0.0000000} ms", timer.ElapsedMilliseconds);
        Console.WriteLine("{0:###0.0000000} per millisecond", (count / (decimal)timer.ElapsedMilliseconds));
        Console.WriteLine("{0:###0.0000000} per second", (count / ((decimal)timer.ElapsedMilliseconds / 1000)));
        Console.WriteLine("{0:###0.0000000} per minute", (count / ((decimal)timer.ElapsedMilliseconds / 1000 / 60)));
    }

1 番目と 2 番目の例の唯一の違いは、using ステートメントの位置です。ForEach 内に using ステートメントがあると時間がかかると思っていましたが、実際にはそうではないことが証明されました。

これはなぜですか? また、上記の例の中で、これをテストする正確な方法はどれですか? 私はおそらくこのテストを間違った方法で行っていますか?

私がやりたいことは、自分のサービスに対して 10000 回の同時呼び出しを行い、それにかかる時間を確認することだけです。

4

2 に答える 2

4

最初の例では、単一のProxyオブジェクトがあります。2 番目の例では、複数のProxyオブジェクトがあります。

usingこれは文言に直結するのではなく、使い方だと思います。最初の例では、Proxyオブジェクトが並列操作のボトルネックになります。

于 2013-02-05T11:48:04.947 に答える
2

これらは 2 つの非常に異なるものです。

  • 最初の例では、単一のプロキシ オブジェクトで複数のスレッドを実行しています。これにより、処理が効果的にシリアル化され、並列性が失われます
  • 2 番目の例では、各スレッドに独自のプロキシ オブジェクトがあり、他のスレッドから独立して (同時に) 実行できます。

作業量は多かれ少なかれ等しい2ですが、2 番目の例はより多くの作業を並行して実行できるため、より早く終了します。


1そこのどこかにロックがあると仮定しています。そうしないと、競合状態になります。

2これらすべてのプロキシを作成するコストを無視します。

于 2013-02-05T12:00:24.043 に答える