Комментарии 33
НЛО прилетело и опубликовало эту надпись здесь
Компактный сериализатор для кэшаСначала прочитал «Компактный стерилизатор для кошек».
Доктор, что со мной?
-1
Для бенчмарков: https://github.com/dotnet/BenchmarkDotNet.
Для еще большего ускорения можно поменять свойства на поля.
Спасибо за статью, отличная работа.
Для еще большего ускорения можно поменять свойства на поля.
Спасибо за статью, отличная работа.
+2
Обычно, для таких случаев хватает MsgPack
+1
Не приходилось раньше слышать. Посмотрю внимательнее, спасибо.
0
И ещё в сторону ProtoBuf от Гугла можно. Структуры он компактно описывает, но гзипом поверх него все равно бывает полезно пройтись.
Опять же, есть в реализации для всего, можно с фронтом данными обмениваться.
0
Сравните с Nfx.Slim
+1
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Было бы интересно прочитать в виде статьи или хотя бы глянуть на образчик
0
Мне бы тоже было интересно глянуть на код примера.
Но в целом да, такой подход может быть даже удобнее, когда исходники сериализуемых классов доступны и находятся в том же солюшене. Если в другом/разделяются с другими командами — уже могут быть трудности. Опять же, может всё-таки возникнуть потребность создать десериализатор для старого варианта объекта, который только в виде сборки сохранился. Всё впрочем, зависит от задачи, конечно, и как работа в целом построена.
T4 у нас использовался для сериализации в другом месте, не знаю, почему он в первую очередь в голову не пришёл.
Но в целом да, такой подход может быть даже удобнее, когда исходники сериализуемых классов доступны и находятся в том же солюшене. Если в другом/разделяются с другими командами — уже могут быть трудности. Опять же, может всё-таки возникнуть потребность создать десериализатор для старого варианта объекта, который только в виде сборки сохранился. Всё впрочем, зависит от задачи, конечно, и как работа в целом построена.
T4 у нас использовался для сериализации в другом месте, не знаю, почему он в первую очередь в голову не пришёл.
0
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Отимизация действительно получилась неплохая. В чём она, если не секрет?
При таком подходе, однако, могут возникнуть проблемы на этапах разработки и сборки, а MsBuild/TfsBuild и динамичный состав команды порой приносят немало боли. Надо обеспечить процесс так, чтобы dll-ка на момент запуска шаблона уже лежала в нужном месте и с нужной версией. Если понадобится добавить ещё сборки, или изменить условие фильтрации — надо каждый раз править шаблон и проверять, чтобы ни для кого из нужных классов сериализаторы не потерялись. Плюс условие выбора классов может не выражаться так просто, а кода в итоге получается много, методы SerializerHelper для каждого из них дублируются (хотя это как раз решаемо). Кто-то может не сообразить, что сериализатор автогенерированный, и руками подхачить (MS обычно на такие случаи предупреждения в начале файла пишет). Если сериализуемых классов не очень большое количество, написание просто EmitSerializer<TheClass> может быть гибче, и не нужно заморачиваться, откуда класс взялся — лишь бы он был в используемых пространствах имен.
Но выигрыш производительности 0.0013/0.0027, повторюсь, интригует. Это именно за счёт T4 или изменений самого способа сериализации?
При таком подходе, однако, могут возникнуть проблемы на этапах разработки и сборки, а MsBuild/TfsBuild и динамичный состав команды порой приносят немало боли. Надо обеспечить процесс так, чтобы dll-ка на момент запуска шаблона уже лежала в нужном месте и с нужной версией. Если понадобится добавить ещё сборки, или изменить условие фильтрации — надо каждый раз править шаблон и проверять, чтобы ни для кого из нужных классов сериализаторы не потерялись. Плюс условие выбора классов может не выражаться так просто, а кода в итоге получается много, методы SerializerHelper для каждого из них дублируются (хотя это как раз решаемо). Кто-то может не сообразить, что сериализатор автогенерированный, и руками подхачить (MS обычно на такие случаи предупреждения в начале файла пишет). Если сериализуемых классов не очень большое количество, написание просто EmitSerializer<TheClass> может быть гибче, и не нужно заморачиваться, откуда класс взялся — лишь бы он был в используемых пространствах имен.
Но выигрыш производительности 0.0013/0.0027, повторюсь, интригует. Это именно за счёт T4 или изменений самого способа сериализации?
0
НЛО прилетело и опубликовало эту надпись здесь
Ещё один хороший вариант — вместо Reflection.Emit использовать System.Lync.Expression.Compile()
+1
ЕМНИП он в два раза медленнее, при сравнимых затратах на инициализацию.
0
ничуть — оно компилируется в точно такой же IL код, что и Emit… только если что-то не так будет с генерацией — ошибка будет понятной, прямо на вызове Compile(), в отличие от Emit, который, в теории, может дать runtime ошибку.
0
посмотрел статью…
По скорости там в статье по ссылке есть сравнение — у них в 2-3 раза получилось медленнее, чем Native доступ (а в случае IL Emit тоже будут задержки). Кроме того, они несколько неправильный код генерировали…
Если будет время — сегодня/завтра напишу бенчмарк и выложу код/результаты.
По скорости там в статье по ссылке есть сравнение — у них в 2-3 раза получилось медленнее, чем Native доступ (а в случае IL Emit тоже будут задержки). Кроме того, они несколько неправильный код генерировали…
Если будет время — сегодня/завтра напишу бенчмарк и выложу код/результаты.
0
Вот статья с замерами: habr.com/post/413561
0
Nuget-пэкедж protobuf-net делает примерно тоже самое, но протестирован и поддерживается.
Скорость такая же примерно. Поддерживает модификацию схемы с обратной совместимостью (на основе нумерации полей).
А ещё и имплементирует общеизвестный «стандарт» сериализации.
Скорость такая же примерно. Поддерживает модификацию схемы с обратной совместимостью (на основе нумерации полей).
А ещё и имплементирует общеизвестный «стандарт» сериализации.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Компактный сериализатор для кэша c использованием System.Reflection.Emit