我有一个本地托管的WCF服务,提供一个基本方法,返回你传递给它的字符串值。
我还有一个单元测试,在其中尝试调用该服务10000次,并监测调用完成所需的时间。
在我的测试中,using语句的位置至关重要,如果放置不当,会产生很大的差异,然而我不理解为什么会出现这种情况。
示例1:(35秒)
我还有一个单元测试,在其中尝试调用该服务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)));
}
第一个和第二个示例之间唯一的区别是using语句的位置。我本以为在ForEach内部使用using语句会更耗时,但实际上证明了相反的情况。
为什么会这样,并且上述示例中哪一个才是正确测试的方式?也许我正在错误地进行此测试?
我想做的只是对我的服务进行10000个并发调用并查看所需时间。
using
语句来实例化客户端代理是一种不好的做法,可以在 StackOverflow 上搜索“如何关闭客户端 WCF 代理”。 - sll