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

Performance 为什么序列化(JavaScriptSerializer)在匿名类型上花费两倍的时间,performance,serialization,.net-4.0,anonymous-types,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;

一些基本测试表明,在匿名类型上使用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);
            }
        }
    }
}
namespace ConsoleTestApp
{
公共课程
{
受保护类示例
{
私有静态整数计数=0;
公共布尔阿尔法;
公共int-Beta;
公共字符串Gamma=string.Format(“count:{0}”,count++);
}
公共静态void Main(字符串[]args)
{
JavaScriptSerializer serializer=新的JavaScriptSerializer();
整数计数=100000;
for(int i=0;i
结果是,使用VS2010(高级版)中的内置探查器:


当我第一次注意到这一点时,我想“当然,因为它是匿名的,序列化程序必须检查它才能知道要序列化什么”。但是,当我考虑到匿名类型仍然是静态类型到编译器时,这种直觉反应似乎是错误的,它只是匿名的。因此,假设序列化程序与非匿名类型具有同样多的关于匿名类型的信息。或者这是错误的?(或者,我的上述测试是否有缺陷?

这里只是试探一下,但这可能是因为每次循环时都在生成新的“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);
}
int计数=100000;
样本=新样本();
for(int i=0;i

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

好主意。然而,类似的结果。(非匿名者约占30%,匿名者约占65%)