2011-04-19 50 views
3

我知道這兩個庫的功能和設計,但我還沒有發現這兩者之間的任何直接性能比較。兩者絕對是偉大的庫。關於設計,我認爲protobuf-csharp-port應該稍微快一些,因爲反射較少,對吧?protobuf-net與protobuf-csharp-port的性能

此外:

  • 當將protobuf網V2被釋放?任何計劃,馬克?
  • 是否會有一個新版本的protobuf-csharp-port,Jon?

謝謝。

回答

7

重新表現; protobuf-net旨在儘可能少地執行反射,然後創建高效的數據訪問代碼。在v2中,它在很多方面需要更多 - 使用多得多低級元編程和如果你想要它(完全可選),預生成獨立的串行器DLL - 所以在運行時反射成本在最小(如果使用運行時元編程)到零(如果使用預生成)之間。

Re release; 「什麼時候準備好」;生活是瘋狂的忙碌,但一個alpha dll可用於完整的.NET和iPhone(後者可能適用於大部分較輕的運行時間,因爲iPhone是最嚴格的)。最終,現實情況是(作爲未參與者等),它將落後於工作和家庭之類的事情 - 儘管如此,我儘可能找到時間。

我覺得一個比較明智的比較是的目標; protobuf-net被設計爲可以很容易地安裝到您現有的DTO或領域模型上,無需大量返工 - 或者用於代碼優先的場景。它也從.proto支持代,但這不是主要目標(但當然非常合意)。它還運行着一個非常不同的API,圍繞常見的.NET隱喻,而不是普通的protobuf隱喻。

,或者換一種說法:

  • 的protobuf-CSHARP端口集中在protobuf的,並增加了C#/。NET對現有的protobuf景觀在C#
  • protobuf網焦點/ .NET,並添加protobuf到現有的C#/ .NET格局

一個微妙的區別,也許 - 事實上或者會爲.NET創造一個有價值的序列化API。

作爲一個推論,如果您的主要目標是在您在同一團隊中積極工作的異構環境之間進行互操作 - 那麼protobuf-csharp-port可能更適合您。我也有點......「鬆」與protobuf,所以我沒有(很好,最小)內疚超出標準規範(雖然保留在協議定義內),以繼承shoehorn,全圖等 - 這在.NET生態系統中很常見,但在protobuf中沒有直接映射。當然,我可以更多地關注像WCF這樣的工具(並且程度較低:遠程處理)。

+0

哇!謝謝你的詳細解答(與往常一樣 - 關於我讀到的有關protobuf-net的最近50篇文章)。正如我所說,我知道這兩個項目的哲學,事實上,我希望使用其中一個的場景是將Silverlight客戶端集成到現有的protobuf環境中:.proto first - > java(client + server incl。xml/json格式化程序),c#,...但是,我可以同時使用這兩個庫(當前版本)。但是我真正感興趣的是性能比較 - 即使它只有幾毫秒。我是對的,protobuf-csharp-port(理論上)不能比protobuf-net慢嗎? – Stephan 2011-04-19 21:19:15

+2

@Stephan他們很可能是相同的球場;取決於編碼如何實現可能導致任一方向的變化。但是,在這兩種情況下,真正的瓶頸都是帶寬(磁盤或網絡)。這兩者應該在電線上幾乎相同。總之,「顯然」不是更快或更慢。儘管可以自由地進行配置。 – 2011-04-19 22:09:30

+0

好的,馬克,謝謝你的回答以及你投入protobuf-net的所有努力。 – Stephan 2011-04-19 22:14:34

2

當我使用protobuf-csharp-port時,我在這個庫中發現了一個bug。 例如,當我喜歡這個創建消息:

message CalculateInfo{ 
    required string CalStarttime=1; 
    optional string CalEndtime=2; 
    required string Smiles=3; 
    optional string CAS=4; 
    optional string ChName=5; 
    optional string EnName=6; 
    required string Param=7; 
    required bytes Result=8; 
    required bool IsFinished=9; 
} 

    message GetAllCalulateResponse{ 
     required bool isSuccessful = 1; 
     required int32 Count=2; 
     repeated CalculateInfo History=3; 

    } 

這樣的代碼(在python):

msg_resp.Count = LEN(結果集)

calculateInfo = [None] * msg_resp.Count 
cnt = 0 
for result in resultSets: 
    calculateInfo[cnt] = msg_resp.History.add() 
    calculateInfo[cnt].CalStarttime = str(result.calculateStartTime) 
    calculateInfo[cnt].CalEndtime = result.calculateEndTime.strftime('%Y-%m-%d %X') 
    calculateInfo[cnt].IsFinished = result.isFinished 
    calculateInfo[cnt].Param = result.paramInfo 
    calculateInfo[cnt].Result = str('ff'*1000) #result.result 

    calculateInfo[cnt].Smiles = result.smilesInfo.smilesInfo 
    calculateInfo[cnt].CAS = result.smilesInfo.casInfo 

    nameSets = CompoundName.objects.filter(simlesInfo=result.smilesInfo.pk,isDefault=True) 
    for nameSet in nameSets: 
     if nameSet.languageID.languageStr == Chinese_Name_Label: 
      calculateInfo[cnt].ChName = nameSet.nameStr 
     elif nameSet.languageID.languageStr == English_Name_Label: 
      calculateInfo[cnt].EnName = nameSet.nameStr 

    cnt = cnt +1 

C#代碼將發生此錯誤: 解析協議消息時,輸入意外地在字段中間結束。這可能意味着要麼輸入被截斷,要麼嵌入的消息誤報自己的長度。

當我小calculateInfo [cnt] .Result,它再次工作。

+0

如果你還沒有,你應該爲此提出一個錯誤。 – JohnD 2013-01-22 21:31:18