2016年1月20日水曜日

[C#]コンテナのベンチマーク

C#のコンテナの処理コストはどれくらいなのか調べてみた。

結果的には、
ListのRemoveAtは先頭を削除すると前詰めでo(n)の処理時間がかかるので重くなる
Dictionaryの登録時にハッシュを作る処理時間分遅くなっている。
それ以外はどれも同じぐらいだった。


1000万回繰り返したときの時間[ms]

Queue
 Enqueue: 239.6727
 Dequeue:142.5946

Stack
 Push:147.5971
 Pop:103.0714

List
 Add:173.6246
 RemoveAt:134.5897

Dictionary
 Add.688.0982
 Remove:285.1807


下はソースコード

   var q = new Queue<int>();
   var s = new Stack<int>();
   var l = new List<int>();
   var d = new Dictionary<int, int>();
   var dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    q.Enqueue(i);
   }
   var dt1 = DateTime.Now;
   Console.WriteLine($"Enqueue:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    q.Dequeue();
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Dequeue:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    s.Push(i);
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Push:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    s.Pop();
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Pop:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    l.Add(i);
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Add:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    l.RemoveAt(l.Count - 1);
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"RemoveAt:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    d[i] = i;
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Add:{(dt1 - dt0).TotalMilliseconds}");

   dt0 = DateTime.Now;
   for (int i = 0; i < 10000000; i++)
   {
    d.Remove(i);
   }
   dt1 = DateTime.Now;
   Console.WriteLine($"Remove:{(dt1 - dt0).TotalMilliseconds}");

0 件のコメント:

Androider