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.
a możesz podać równiez czas do wersji bez boxingu/unboxingu? Tzn żeby było z czym porównać?
@rek:
Drugi kod zawiera porownanie boxing vs unboxing. FastList to 235 a SlowList az 2065.
BUAHAHA….. nie zauważyłem, że fastList jest Listą intów -no to wszystko sie zgadza 😀