decimal vs double, część II (wydajność)

W poprzednim w poście, przedstawiłem różnice między decimal a double. Powinno być już jasne, kiedy jaki typ stosować. Jeszcze raz chcę tylko podkreślić, że wybór między decimal a double to coś więcej niż między int16 a int32. Wybranie double w nieprawidłowych scenariuszach może przynieść bardzo trudne w znalezieniu błędy. Wybranie z kolei Int32 zamiast Int16 raczej nie przyniesie ubocznych efektów.

Dziś z kolei o wydajności… Typ double jest szeroko znany i z tego względu wspierany przez hardware. Operacje na nim są DUŻO szybsze niż na decimal. Zobaczmy następujący przykład:

internal class Program
{
   private static void Main(string[] args)
   {
       const int n = int.MaxValue;

       Stopwatch stopwatch = Stopwatch.StartNew();

       double doubleType = 0;
       for (int i = 0; i < n; i++)
       {
           doubleType ++;
       }

       Console.WriteLine(stopwatch.ElapsedMilliseconds);

       stopwatch = Stopwatch.StartNew();

       float floatType = 0;
       for (int i = 0; i < n; i++)
       {
           floatType ++;
       }

       Console.WriteLine(stopwatch.ElapsedMilliseconds);

       stopwatch = Stopwatch.StartNew();

       decimal decimalType = 0;
       for (int i = 0; i < n; i++)
       {
           decimalType ++;
       }

       Console.WriteLine(stopwatch.ElapsedMilliseconds);
   }
}

Wynik:

image

Jak widać, różnica jest ogromna, mająca realny wpływ na aplikacje – oczywiście zależy to od typu oprogramowania. Mowa o systemach, które wykonują różne obliczenia 24h na dobę.

Double i Float z kolei mają taką samą wydajność. Dla procesorów 64 bitowych nie ma bowiem to znaczenia – dla starej architektury, float jest szybszy niż double. Jeśli piszemy aplikację na PC, wtedy polecam korzystać zawsze z double – nie ma sensu używać float, który ma taką samą wydajność a dużo mniejszą precyzję.

Leave a Reply

Your email address will not be published.