2011-08-01 60 views
0

Ive得到返回的內容類型「應用程序/ x-gzip的」基本上看來是XML /的JSON使用gzip壓縮的WCF服務。我實現了一個GzipMessageEncoder和CustomBinding作爲卡洛斯菲蓋拉以下鏈接描述:該分割了架構和應用WCF + Gzip已性能問題

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/8c3eafae-b6a1-441f-85ef-90721d941a1a

對於數據,我的服務回報我使用了一個基本的電網概念W/JSON每一行字符串[]讓事情變得緊湊:

​​

gzip的工作很好,但我覺得我的客戶端上的性能很慢/不一致,使用的ChannelFactory:

private ChannelFactory<T> CreateFactory<T>(CustomBinding binding, string endpoint) 
    { 
     EndpointAddress _endpoint = new EndpointAddress(endpoint); 
     ChannelFactory<T> _factory = new ChannelFactory<T>(binding, _endpoint); 

     _factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

     return _factory; 
    } 

這是我如何啓動服務:

static string baseAddress = "http://" + Dns.GetHostName() + ":4050/ZipTest"; 
    static ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     ThreadPool.SetMinThreads(Environment.ProcessorCount, 9); 

     host.AddServiceEndpoint(typeof(IGzipTest), 
      GzipMapper.GetBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

     host.Open(); 
    } 

下載時〜512KB到〜1MB的數據(壓縮後,多數民衆贊成),這些都是在單獨的連續測試,我的性能測試結果:

1st Request: 4439ms 
    2nd Request: 19029ms 

    ..and so on 

似乎每隔一個電話服務需要大約4-5倍的時間。即使只有512kb到1mb的數據,4000毫秒似乎也很長,所以我想知道什麼是錯的。

舉例來說,如果我從使用[WebGet]裝飾方法只在最需要一秒鐘,因爲我打400-500kb瀏覽器下載。廣州文件本身/ s的最差。

回答

2

我已經看到了類似的波動,至少這是我目前的想法,它是由GzipMessageEncoder和緩衝的TransferMode(默認值)的過度內存使用引起的。緩衝TransferMode使用緩衝管理器,這可能會導致嚴重的內存問題,併爲我造成OutOfMemoryExceptions。

無論確切的原因,我固定的,也大大減少了內存消耗和

  1. 擺脫GzipMessageEncoder的服務器和客戶端的CPU負載,見wcf conditional compression
  2. 改爲流TransferMode,看到How can I prevent BufferManager/PooledBufferManager in my WCF client app from wasting memory?