ローカルでホストされている 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 回の同時呼び出しを行い、それにかかる時間を確認することだけです。