Wpis z mikrobloga

#jezykc #cpp #programowanie Zawsze słyszałem żeby korzystać z jednowymiarowych tablic int* niż dwuwymiarowych int**,
porobiłem pare testów i wyszło że te dwuwymiarowe są ok. 4x lub wiecej szybsze niż 1 wymiarowe, przynamjniej kompilujac na Intelu visual studio x86, chce jeszcze sprawić na docelowej architekturze 68k.. może to wybika z tego że żeby móc traktoac 1 wymiarowa tablicę jako macierz trzeba jednac sobie obliczyć index = x + y * width - co jest dodatkową operacją.. w każdym razie w tym przypadku przyrost wydajności bardzo duży..
  • 41
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

for (int i = 0; i < RC_render_width_i; ++i)
{
tab_2d_1[i] = (my_struct*)malloc(RC_render_width_i * sizeof(my_struct));
}

wymiary ci się pomieszały
  • Odpowiedz
na razie to widze, że to się wysypuje jak np dodam jeszcze jednego inta do structa. Coś jest nie tak z tym. Oprócz tego fora co ci go znalazłem, to jeszcze powinno być tab_2d_1 = (my_struct**)malloc(RC_render_width_i * sizeof(my_struct*)); - zabrakło ci * w sizeof
  • Odpowiedz
@ZawzietyRobaczek, podkręciłem te wymiary x10 i mam trochę dokładniejsze pomiary. I faktycznie, 2d jest szybsze:

test 1: 0.701000 701
test 2: 0.207000 207

No i już widzę czemu: przechodzisz tablicę w najgorszy możliwy sposób. Nie po kolei, ale w każdej pętli skaczesz do kolejnego wiersza w tabeli. Zamieniłem w test1 fory miejscami (najpierw po ry, potem po rx: https://paste.ofcode.org/dmFcZCeWMgE4ZT6qPCMrTW ) i mam taki
  • Odpowiedz
@ZawzietyRobaczek, a nie, cofam. Bo zrobiłeś w test1 zasadniczo tablicę [ry][rx] a w test2 [rx][ry], potem przechodziłeś w sposób optymalny dla [rx][ry] i maksymalnie zły dla [ry][rx]. Stąd miałeś różnice w wynikach x4, tyle że to nie testowanie 1d vs 2d tylko "zgodnie z cache" vs "na złość cache".

W tym moim 134 vs 207 masz prawdziwą różnicę w wydajności 1d vs 2d na korzyść 1d.
  • Odpowiedz
@zrakiep: ok, widzę różnice przy zamianie rx na ry.. wtedy faktycznie wynik jest odwrotny, ale mysle że mozna wykorzystać tą pierwszą wersję, lub dostosowac kod do niej zeby poprawić wydajnosc - na kwadratowej tez jest na korzysc 2d
  • Odpowiedz
@zrakiep: chociaż nie.. widać wszystko zalezy od kolejnosci dostępu rx->rx lub ry->rx w tym drugim jest wolniej faktycznie ale w tym pierwszym szybciej.. wiec kwestia dostosowania kodu programu zeby to wykorzystać i sprawdzenia bo łatwo się machnąć w tym,
  • Odpowiedz
@ZawzietyRobaczek: Nie, to nie tak - masz dwie różne tablicę. Popatrz na kod do znajdowani indeksów:

int tab1_index = rx + ry * RC_render_width_i;
Każdy kolejny ry jest od siebie oddalony od RC_render_width_i. Natomiast w drugiej tablicy masz [rx][ry] - każdy kolejny ry jest obok siebie.

Jak przechodzisz tablicę po kolei po ry, to w teście 1 skaczesz co RC_render_width_i (źle dla cache) a w teście 2 o
  • Odpowiedz