本文測試遠程調用以下對象時的執行速度:
- 無成員的MarshalByRefObject
- 50個屬性的MarshalByRefObject
- 無成員的Serializable
- 50個屬性的Serializable
場景是這樣的:客戶端獲取服務端,把自己註冊給服務端,然後服務端回調客戶端,並傳遞上述的對象。
代碼下載
https://www.box.com/s/lai03ktzdi0gzo5tlv63
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可能效率就比較低了,因爲計算所用的參數還要傳回服務器,服務器結果還要返回客戶端。