środa, 2 października 2013

TUTAJ znajduje się kod na którym wykonałem testy.
TUTAJ są wyniki testów.
Przedmiotem badania wydajności są:
1. Tablica wielowymiarowa:
int[,] array = new int[x, y];
  • dostęp do tych tablic jest najwolniejszy
  • alokacja bardzo szybka, to tylko jeden obiekt
  • podczas każdego obiegu pętli wykonywane są przez CLR dodatkowe obliczenia, które sprawdzają czy dany indeks nie wyszedł po za zakres w postaci: 
    if(0 >= a.GetLowerBound(0)) && ((i) <= a.GetUpperBound(0))
    
  • w przypadku tablic jednowymiarowych najczęściej sprawdzanie indeksu wykonywane jest jeden raz tuż przed wykonaniem pętli:
    if(0 >= a.GetLowerBound(0)) && ((elementsCount – 1) <= a.GetUpperBound(0))
    
  • w każdej iteracji CLR oblicza prawidłowy indeks dostępu
2. Tablica tablic (jagged array):
int[][] array = new int[x][]; 
  for (int i = 0; i < array.Length; i++) 
    array[i] = new int[y];
  • dostęp do tej tablicy jest najszybszy ponieważ tablica ta zachowuje się jak jednowymiarowa
  • alokacja takiej tablicy jest zdecydowanie wolniejsza od tablicy wielowymiarowej, tworzone jest wiele obiektów, na których pracuje GC
  • ilość tworzonych obiektów to x + 1
  • jest to najlepsze rozwiązanie dla sytuacji gdy tablica tworzona jest tylko raz po czym wielokrotnie uzyskiwany jest dostęp do elementów tej tablicy
3. Tablica unsafe:
int[,] array = new int[x, y]; 
fixed (int* pointer = array) { }
  • szybsza inicjalizacaja niż jagged array
  • jest to rozwiązanie gdzie dostęp do obiektów jest szybszy od tablicy wielowymiarowej ale wolniejszy ale trochę wolniejszy dostęp
  • jest to rozwiązanie które jest dokładnie po środku pomiędzy jagged array a tablicami wielowymiarowymi
  • łatwo popełnić błąd i wyjść po za zakres tablic
Testy przy użyciu opcji Analyze -> Launch Performance Wizard... potwierdziły wyżej wymienione spostrzeżenia. Dodatkowym wnioskiem jest fakt, że ilość zajmowanej pamięci przez te tablice w ogóle nie zależy od ich rodzajów i jest stały za wyjątkiem tablicy jagged array która zajmuje znikomo, nieznacznie, praktycznie niezauważalnie nieco więcej pamięci ze względu na większą ilość obiektów będących pod-tablicamy tablicy głównej.
Kod pisałem zainspirowany artykułem Piotra Zielińskiego dostępnego tutaj: http://www.pzielinski.com/?p=1411.

1 komentarz :