2013-02-05 64 views
3

我有一個本地託管的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次併發呼叫到我的服務,看看需要多長時間。

+2

這是一個糟糕的做法,在''using'語句中包裝客戶端代理實例,''如何關閉客戶端WCF代理''搜索stackoverflow'' – sll

+5

它可能與第一個示例跨每個共享同一個代理線程,所以他們不是並行執行? – levelnis

+0

@sll謝謝,我不知道這件事。將閱讀它並確保實例化和處理正確完成。 – Matei

回答

4

在第一個例子中,有一個單一的Proxy對象;在第二個示例中,有多個Proxy對象。

我認爲這不是直接與using陳述,但它是如何使用。在第一個例子中,Proxy對象成爲並行操作的瓶頸。

2

這是兩個完全不同的事情:

  • 在第一示例中,將在單個代理對象,這有效地串行化處理並破壞並行運行的多個線程。
  • 在第二個示例中,每個線程都有自己的代理對象,允許它獨立於(並且同時運行)其他線程運行。

工作的量更少等於,但第二示例完成越早僅僅是因爲更多的工作可以並行完成。


我假設有一個鎖的地方在那裏,否則,你的競爭條件。

不顧創建所有這些代理的成本。

+0

感謝您的洞察力,我現在更瞭解這一點。然後,示例1與我需要測試做的事情無關。 – Matei

+0

+1好答案。 – daryal