Почему сериализация (JavaScriptSerializer) занимает в два раза больше времени для анонимных типов - PullRequest
2 голосов
/ 19 октября 2011

Некоторые базовые тесты показывают, что сериализация в JSON с использованием JavaScriptSerializer занимает в два раза больше времени для анонимных типов, чем для аналогичного вида неанонимного типа.

Пример кода:

namespace ConsoleTestApp
{
    public class Program
    {
        protected class Sample
        {
            private static int count = 0;
            public bool Alpha;
            public int Beta;
            public string Gamma = String.Format("count: {0}", count++);
        }

        public static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            int count = 100000;
            for (int i = 0; i < count; i++)
            {
                Sample sample = new Sample();
                string result = serializer.Serialize(sample);
            }

            for (int i = 0; i < count; i++)
            {
                var anon = new { Alpha = true, Beta = 1, Gamma = String.Format("count: {0}", count) };
                string anonResult = serializer.Serialize(anon);
            }
        }
    }
}

Результат с использованием встроенного профилировщика в VS2010 (редакция Premium):

The result, using the built in profiler in VS2010 (premium ed.)

КогдаЯ впервые заметил это, подумал: «Конечно, потому что это анонимно, и сериализатор должен проверить это, чтобы знать, что сериализировать».Но эта внутренняя реакция казалась неправильной после того, как я на мгновение подумал, что анонимный тип все еще статически типизирован для компилятора, он просто анонимный.Таким образом, гипотетически сериализатор имеет столько же информации об анонимном типе, сколько и неанонимный тип.Или это неверно?(Или, как вариант, мой вышеописанный тест некорректен?)

1 Ответ

1 голос
/ 20 октября 2011

Просто сделайте удар здесь, но это может быть из-за того, что вы делаете новые типы «anon» каждый раз, когда делаете свой цикл. Это будет означать, что сериализатор должен работать, если он уже создал шаблон для сериализации для этого типа или нет.

Попробуйте этот тест вместо:

int count = 100000;
Sample sample = new Sample();
for (int i = 0; i < count; i++)
{
    string result = serializer.Serialize(sample);
}

var anon = new { Alpha = true, Beta = 1, Gamma = String.Format("count: {0}", count) };
for (int i = 0; i < count; i++)
{
    string anonResult = serializer.Serialize(anon);
}

А затем опубликуйте результаты этого. Если есть какие-либо улучшения производительности, такие как «Я уже сериализовал объект THAT», то вышеупомянутый тест также должен учитывать это как для определенного, так и для анонного типов.

...