я ответил на твой e-mail; Я не знала, что вы также разместили это здесь. Первый вопрос, который у меня есть: какая версия protobuf-net? Причина, по которой я спрашиваю, состоит в том, что в стволе development"v2" намеренно отключена автоматическая компиляция, поэтому я могу использовать свои модульные тесты для тестирования как во время выполнения, так и в предварительно скомпилированных версиях. Поэтому, если вы используете «v2» (доступно только в исходном коде), вам нужно указать это для компиляции модели - в противном случае он работает на 100% отражении.
В «v1» или «v2» вы можете сделать это с помощью:
Serializer.PrepareSerializer<Person>();
Сделав это, числа, которые я получаю (из кода в вашем электронном письме; я не проверял, является ли приведенный выше образец того же самого):
10
Person got created using protocol buffer in 10 milliseconds
197
Person got created using XML in 197 milliseconds
3
Person got created using binary in 3 milliseconds
Другим фактором являются повторы; Откровенно ничего не 3; Вы не можете сравнивать числа вокруг этого уровня. Подняв его, чтобы повторить 5000 раз (повторное использование экземпляров XmlSerializer
/ BinaryFormatter
; ложные затраты не введены), я получаю:
110
Person got created using protocol buffer in 110 milliseconds
329
Person got created using XML in 329 milliseconds
133
Person got created using binary in 133 milliseconds
Принимая это к более глупым крайностям (100000):
1544
Person got created using protocol buffer in 1544 milliseconds
3009
Person got created using XML in 3009 milliseconds
3087
Person got created using binary in 3087 milliseconds
Итак, в конечном итоге:
- когда у вас практически нет данных для сериализации, большинство подходов будут очень быстрыми (включая protobuf-net)
- при добавлении данных различия становятся более очевидными; Как правило, protobuf здесь превосходен, как для отдельных больших графов, так и для множества маленьких графов
Также обратите внимание, что в "v2" скомпилированная модель может быть полностью статически скомпилирована (в dll, который вы можете развернуть), что устраняет даже (и без того небольшие) затраты на ускорение.