boxing(ボックス化)とは、値型を参照型であるobjectに変換する機能。
これにより、参照型であるobjectに値型を代入することができる。
ただし、パフォーマンス上の注意が必要。Generic型を使用することにより、boxingを防ぐことができる。
- static void Main(string[] args)
- {
- var val = new Struct();
- var val2 = new Class();
- Stopwatch sw = Stopwatch.StartNew();
- for (int i = 0; i < 1000000000; i++)
- {
- object obj = val;
- }
- Console.WriteLine("struct -> object:" + sw.Elapsed);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 1000000000; i++)
- {
- var obj = val;
- }
- Console.WriteLine("struct -> struct:" + sw.Elapsed);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 1000000000; i++)
- {
- object obj = val2;
- }
- Console.WriteLine("class -> object:" + sw.Elapsed);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 1000000000; i++)
- {
- var obj = val2;
- }
- Console.WriteLine("class -> class :" + sw.Elapsed);
- var list = new List<Struct>(100000000);
- var list2 = new List<Class>(100000000);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 100000000; i++)
- {
- list.Add(val);
- }
- Console.WriteLine("generic list <- struct:" + sw.Elapsed);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 100000000; i++)
- {
- list2.Add(val2);
- }
- Console.WriteLine("generic list <- class :" + sw.Elapsed);
- var list3 = new ArrayList(100000000);
- var list4 = new ArrayList(100000000);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 100000000; i++)
- {
- list3.Add(val);
- }
- Console.WriteLine("normal list <- struct:" + sw.Elapsed);
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 100000000; i++)
- {
- list4.Add(val2);
- }
- Console.WriteLine("normal list <- class :" + sw.Elapsed);
- }
- struct Struct
- {
- public int MyProperty { get; set; }
- }
- class Class
- {
- public int MyProperty { get; set; }
- }
0 件のコメント:
コメントを投稿