2010年3月22日月曜日

boxing(ボックス化)

boxing(ボックス化)とは、値型を参照型であるobjectに変換する機能。
これにより、参照型であるobjectに値型を代入することができる。
ただし、パフォーマンス上の注意が必要。Generic型を使用することにより、boxingを防ぐことができる。

  1. static void Main(string[] args)  
  2. {  
  3.     var val = new Struct();  
  4.     var val2 = new Class();  
  5.   
  6.     Stopwatch sw = Stopwatch.StartNew();  
  7.     for (int i = 0; i < 1000000000; i++)  
  8.     {  
  9.         object obj = val;  
  10.     }  
  11.     Console.WriteLine("struct -> object:" + sw.Elapsed);  
  12.     sw.Reset();  
  13.     sw.Start();  
  14.     for (int i = 0; i < 1000000000; i++)  
  15.     {  
  16.         var obj = val;  
  17.     }  
  18.     Console.WriteLine("struct -> struct:" + sw.Elapsed);  
  19.     sw.Reset();  
  20.     sw.Start();  
  21.     for (int i = 0; i < 1000000000; i++)  
  22.     {  
  23.         object obj = val2;  
  24.     }  
  25.     Console.WriteLine("class  -> object:" + sw.Elapsed);  
  26.     sw.Reset();  
  27.     sw.Start();  
  28.     for (int i = 0; i < 1000000000; i++)  
  29.     {  
  30.         var obj = val2;  
  31.     }  
  32.     Console.WriteLine("class  -> class :" + sw.Elapsed);  
  33.   
  34.   
  35.     var list = new List<Struct>(100000000);  
  36.     var list2 = new List<Class>(100000000);  
  37.     sw.Reset();  
  38.     sw.Start();  
  39.     for (int i = 0; i < 100000000; i++)  
  40.     {  
  41.         list.Add(val);  
  42.     }  
  43.     Console.WriteLine("generic list <- struct:" + sw.Elapsed);  
  44.     sw.Reset();  
  45.     sw.Start();  
  46.     for (int i = 0; i < 100000000; i++)  
  47.     {  
  48.         list2.Add(val2);  
  49.     }  
  50.     Console.WriteLine("generic list <- class :" + sw.Elapsed);  
  51.   
  52.     var list3 = new ArrayList(100000000);  
  53.     var list4 = new ArrayList(100000000);  
  54.     sw.Reset();  
  55.     sw.Start();  
  56.     for (int i = 0; i < 100000000; i++)  
  57.     {  
  58.         list3.Add(val);  
  59.     }  
  60.     Console.WriteLine("normal list  <- struct:" + sw.Elapsed);  
  61.     sw.Reset();  
  62.     sw.Start();  
  63.     for (int i = 0; i < 100000000; i++)  
  64.     {  
  65.         list4.Add(val2);  
  66.     }  
  67.     Console.WriteLine("normal list  <- class :" + sw.Elapsed);  
  68. }  
  69.   
  70. struct Struct  
  71. {  
  72.     public int MyProperty { getset; }  
  73. }  
  74.   
  75. class Class  
  76. {  
  77.     public int MyProperty { getset; }  
  78. }  

image
違いは一目瞭然。

0 件のコメント: