为什么序列化(JavaScriptSerializer)在匿名类型上需要两倍的时间

时间:2011-10-19 18:41:12

标签: performance serialization .net-4.0 anonymous-types

一些基本测试表明,使用JavaScriptSerializer对JSON进行序列化对匿名类型的处理速度是对类似外观的非匿名类型的两倍。

示例代码:

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中的内置分析器(高级版):

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

当我第一次注意到这一点时,我想“当然,因为它是匿名的,并且序列化程序必须检查它以了解序列化的内容”。但是,在我考虑一下匿名类型仍然静态地输入编译器之后,这种直觉反应似乎是错误的,它只是匿名的。因此,假设序列化程序具有与匿名类型一样多的非匿名类型的信息。或者这是不正确的? (或者,我的上述测试是否存在缺陷?)

1 个答案:

答案 0 :(得分:1)

只是在这里采取刺,但这可能是因为你每次进行循环时都会制作新的'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);
}

然后发布结果。如果有任何性能改进,例如“我已经序列化了那个对象”,那么上面的测试也应该考虑定义和匿名类型。