2011-10-19 2 views
2

基本的なテストでは、JavaScriptSerializerを使用してJSONにシリアライズすると、匿名型でも同じように見える非匿名型の2倍の時間がかかることがわかります。匿名型でシリアライズ(JavaScriptSerializer)が2倍かかる理由

サンプルコード:

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

ここでスタブを取るだけですが、ループを行うたびに新しい '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); 
} 

をし、その結果をポスト:

は代わりにこのテストを試してみてください。 "私はすでにオブジェクトをシリアライズしました"のようなパフォーマンスの改善がある場合、上記のテストでは、定義された型とアンオン型の両方について考慮する必要があります。

+1

良い考え。しかし、同様の結果。 (非anonでは〜30%、匿名では〜65%) – Matt

関連する問題