.NET遠程調用:MarshalByRefObject和Serializable的性能測試

本文測試遠程調用以下對象時的執行速度:

  1. 無成員的MarshalByRefObject
  2. 50個屬性的MarshalByRefObject
  3. 無成員的Serializable
  4. 50個屬性的Serializable


場景是這樣的:客戶端獲取服務端,把自己註冊給服務端,然後服務端回調客戶端,並傳遞上述的對象。

代碼下載

https://www.box.com/s/lai03ktzdi0gzo5tlv63

https://skydrive.live.com/embed?cid=7EA5197BBA7EBC13&resid=7EA5197BBA7EBC13%21146&authkey=AL6R0X8DgUO8vSk

https://docs.google.com/open?id=0B92-FAjNvVzGX2lMUFliZkl5Qk0


輸出單次時間(20次)
  首次傳輸用時 後續傳輸用時 服務端總用時
無屬性的MBR 62 0 128
50個屬性的MBR 62 0 125
空序列化對象 62 0 124
50個屬性的序列化對象 47 0 117
       
不輸出單次時間+release版+優化(4000次)
  一次性運行 分別運行  
無屬性的MBR 2830 2794  
50個屬性的MBR 2762 2727  
空序列化對象 2132 2203  
50個屬性的序列化對象 3036 3094  


在輸出單次時間的測試中,可以發現第一次連接用時總是比較長,幾乎穩定爲62毫秒。可能是爲了輸出時間,我調用DateTime.Now的關係。

在後面的release測試中,一次性運行就是開一個服務端,開一個客戶端,這個服務端一次性把四個測試全運行了。調整代碼後我發現,第一次MBR測試總是比第二次慢六十幾毫秒,不論第一次是無屬性MBR還是50屬性MBR。這說明第一次封送MBR時,可能把應用程序域裏其他的MBR也處理了一下,所以慢。所以,我又分別運行了這四個測試。

結果表明,MBR無論多少個屬性,傳送時間都是固定的。

傳送空序列化對象比無屬性MBR快了約26%。序列化對象的屬性增加了,序列化時間也增加了。如果序列化對象的屬性數量,和序列化所需時間是正比的話,那麼大約每個屬性花17.82毫秒,如果一個對象有超過33個屬性,可以考慮用MBR

當然了,如果後續還有方法調用,MBR可能效率就比較低了,因爲計算所用的參數還要傳回服務器,服務器結果還要返回客戶端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章