Производительность protobuf-net против protobuf-csharp-port - PullRequest
3 голосов
/ 20 апреля 2011

Я знаю особенности и дизайн обеих библиотек, но я не нашел прямого сравнения производительности между этими двумя. Оба, безусловно, отличные ребята. Что касается дизайна, я думаю, что protobuf-csharp-port должен быть немного быстрее из-за меньшего отражения, верно?

Кроме того:

  • Когда выйдет protobuf-net V2? Есть планы, Марк?
  • Будет ли новая версия protobuf-csharp-port, Джон?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 20 апреля 2011

повторное исполнение;Protobuf-net предназначен для того, чтобы выполнить это отражение как можно меньше, создав после этого эффективный код доступа к данным.В версии v2 это намного дальше во многих отношениях - использование много низкоуровневого метапрограммирования и , если хотите (полностью необязательно), предварительная генерация автономного сериализатораdll - поэтому во время выполнения стоимость отражения находится где-то между минимальной (при использовании метапрограммирования во время выполнения) до нуля (при использовании предварительной генерации).

Re release;"когда он будет готов";жизнь сумасшедшая суета, но альфа-dll доступна как для полного .NET, так и для iPhone (последний, вероятно, будет работать на большинстве более легких сред выполнения, поскольку iPhone является наиболее ограничительным).В конечном счете, реальность такова, что (как без спонсоров и т. Д.) Она будет немного отставать от таких вещей, как работа и семья - хотя я пытаюсь найти время, когда могу.

Я думаю, что более разумное сравнение - это цели ;Protobuf-net разработан так, чтобы его можно было легко установить на существующую модель DTO или предметной области, без значительных переделок, или для использования в сценарии с первым кодом.Он также поддерживает генерацию из .proto, но это не является основной целью (но, конечно, очень желательно).Он также использует совершенно другой API, ориентированный на общие метафоры .NET, а не на общие метафоры protobuf. * ​​1013 *

Или, если выразиться иначе:

  • protobuf-csharp-port ориентирован наprotobuf и добавляет C # / .NET к существующему ландшафту protobuf
  • protobuf-net фокусируется на C # / .NET и добавляет protobuf к существующему ландшафту C # / .NET

Aтонкое различие, может быть - и даже любое из них создаст достойный API сериализации для .NET.

Как следствие, если ваша основная цель - взаимодействие между гетерогенными средами, над которыми вы активно работаете в одной команде, - тогда, возможно, protobuf-csharp-port лучше подходит для вас.

Я тоже немного ... "расстроен" с protobuf, поэтому у меня нет (ну, минимально) чувства вины, выходящего за рамки стандартной спецификации(оставаясь внутри определения протокола), чтобы включить в наследство, полные графы и т. д. - которые распространены в экосистеме .NET, но не имеют прямой карты в protobuf.И, конечно, я могу больше смотреть на такие инструменты, как WCF (и в меньшей степени: удаленное взаимодействие).

2 голосов
/ 20 ноября 2012

Когда я использую protobuf-csharp-port, я обнаружил ошибку в этой библиотеке. Например, когда я создаю сообщение, подобное этому:

    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 (resultSets)

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 # возникнет эта ошибка: При синтаксическом анализе сообщения протокола ввод неожиданно завершился в середине поля. Это может означать, что входные данные были усечены или что во встроенном сообщении неверно указана его длина.

когда я вычисляю маленькуюInfo [cnt]. Результат, он снова работает.

...