Boxing, unboxing–test

Dziś mały eksperyment. Chciałbym pokazać jaki jest faktycznie spadek wydajności jeśli zachodzi potrzeba boxing’u i unboxing’u. Wiele o tym ostatnio pisałem ale nie pokazałem najważniejszego – liczb opisujących wydajność.  Na początek porównanie boxing z unboxing:

 private static void TestBoxingAndUnboxing()
{
   object boxedValue = null;

   // boxing
   Stopwatch stopwatch = Stopwatch.StartNew();
   for (int i = 0; i < Iterations; i++)
   {
       boxedValue = i;
   }
   stopwatch.Stop();
   Console.WriteLine("Boxing:{0}",stopwatch.ElapsedMilliseconds);
   
   // unboxing
   stopwatch = Stopwatch.StartNew();
   for (int i = 0; i < Iterations; i++)
   {
       int unboxed = (int) boxedValue;
   }
   stopwatch.Stop();
   Console.WriteLine("Unboxing:{0}", stopwatch.ElapsedMilliseconds);
}

Wynik to: boxing-1178, unboxing:128. Nie powinno to dziwić – tak jak pisałem kiedyś boxing jest dużo wolniejszy. Ponadto proszę zwrócić uwagę, że przy boxingu potem GC musi zwolnić stworzone obiekty co jest dodatkową utratą wydajności.

Kolejny test to dodawanie elementów do listy. Pierwsza lista (slowList) wymaga boxing’u przy dodawaniu elementu oraz unboxing’u przy każdym czytaniu. Druga kolekcja za to przyjmuje właściwy typ a nie ogólny object.

private static void TestLists()
{
   List<int> fastList=new List<int>();
   List<object> slowList=new List<object>();

   // boxing
   Stopwatch stopwatch = Stopwatch.StartNew();
   for (int i = 0; i < Iterations; i++)
   {
       slowList.Add(i);
       int read = (int)slowList[i];
   }
   stopwatch.Stop();
   Console.WriteLine("Boxing:{0}",stopwatch.ElapsedMilliseconds);
           
   stopwatch = Stopwatch.StartNew();
   for (int i = 0; i < Iterations; i++)
   {
       fastList.Add(i);
       int read = fastList[i];
   }
   stopwatch.Stop();
   Console.WriteLine("Fast list:{0}", stopwatch.ElapsedMilliseconds);
}

Wynik: fastList-235, slowList-2065. Jak pokazuje prosty eksperyment różnica jest ogromna i unikanie boxing’u to nie tylko czytelniejszy kod ale również dużo szybszy.

3 thoughts on “Boxing, unboxing–test”

Leave a Reply

Your email address will not be published.