2011-08-19 135 views
4

我在我的測試環境中兩種不同類型的WCF客戶端的使用如下超過basicHttpBinding的操作將文件發送到WCF服務:Base64編碼的換行符在Visual Studio中造成巨大的性能損失

void SendFile(string filename, byte[] fileBytes) 

我注意到性能巨大差異。對於完全相同的文件和拓撲,SendFile在Client1上的時間少於1秒,但在Client2上的時間大約需要35-40s。

經過一些網絡嗅探之後,我縮小了差異,直到base64編碼內容中的某些換行符。兩個客戶端均以base64編碼文本形式發送fileBytes。然而,Client2以某種方式在文本中插入了許多換行符。我可以始終如一地重現(使用WFetch)其他所有內容都是相同的,但這些換行本身導致了巨大的性能差異。

客戶端1消息:

POST /ParkomatService/CommService HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/ICommService/SendFile" 
Host: 192.168.10.36 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS .NET CF Web Services Client Protocol 3.5.7283.0) 
Cache-Control: No-Transform 
Connection: Keep-Alive 
Content-Length: 266863 


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendFile xmlns="http://tempuri.org/"><filename>test.txt</filename><fileBytes>MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ...(continues)...EyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk=</fileBytes></SendFile></s:Body></s:Envelope> 

客戶機2的消息:

POST /ParkomatService/CommService HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/ICommService/SendFile" 
Host: 192.168.10.36 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS .NET CF Web Services Client Protocol 3.5.7283.0) 
Cache-Control: No-Transform 
Connection: Keep-Alive 
Content-Length: 273879 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendFile xmlns="http://tempuri.org/"><filename>test.txt</filename><fileBytes>MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2 
Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz 
NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw 
MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3 
... 
(continues) 
... 
OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1 
Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk=</fileBytes></SendFile></s:Body></s:Envelope> 

爲什麼這些線路中斷導致服務處理時間相差這麼大?

編輯:在下面的Codo的評論的幫助下,我注意到這種差異只發生在Visual Studio中調試時。如果我直接運行自託管服務,那麼換行符不會導致性能下降。所以,它在Visual Studio中一定是個問題。

+2

您對此問題的分析到目前爲止的結論是,摘要Base-64數據是問題,而不是一些網絡或I/O問題。請求處理後的35-40秒內,您是否看到高CPU負載? BTW。將Base-64數據分割成大約70到80個字符的行是最佳實踐。 – Codo

+0

謝謝,問題解決了!我其實並沒有看CPU的使用情況:)我在Visual Studio中以調試模式運行服務進程,以便能夠查看不同的事情,並根據您的建議,我意識到CPU實際上被devenv 。可執行程序。在VS之外運行服務可執行文件的調試版本,沒有問題!很有意思。 –

+0

@Codo你應該寫一個答案,以便它可以被接受。 –

回答

1

事實證明,只有在連接了Visual Studio調試器的情況下運行服務時纔會出現性能差異。當在VS外跑步時,差異消失了,帶換行符的版本與其他版本具有相同的性能。

我不知道爲什麼這些行會打破VS的減速過程,但如果您在代碼中看到任何性能問題,最好在您要嘗試的事情列表上保持「在VS外運行」。

+0

https://dzone.com/articles/important-wcf-performance – TweeZz

相關問題