我有一個本地託管的WCF服務,公開一個基本方法,該方法返回您傳遞給它的字符串值。在單元測試中使用語句的性能影響
我也有一個單元測試,我嘗試撥打該服務10000次,並監視完成呼叫所需的時間。
在我的測試中,我的使用聲明的位置是至關重要的,如果放置不正確會造成很大的差異,但我不明白爲什麼會發生這種情況。
實施例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)));
}
的第一和第二實施例之間唯一的區別是使用的語句的位置。我會認爲在ForEach中使用using語句需要更長的時間,但實際上證明了這一點。
爲什麼會這樣呢,以及上面哪個例子是測試這個的準確方法?我是否可能以錯誤的方式進行這項測試?
我想要做的就是10000次併發呼叫到我的服務,看看需要多長時間。
這是一個糟糕的做法,在''using'語句中包裝客戶端代理實例,''如何關閉客戶端WCF代理''搜索stackoverflow'' – sll
它可能與第一個示例跨每個共享同一個代理線程,所以他們不是並行執行? – levelnis
@sll謝謝,我不知道這件事。將閱讀它並確保實例化和處理正確完成。 – Matei