Wydajność pamięci jest niezwykle ogólnikowa.
Myślę, że to, czego szukasz, dotyczy obsługi pamięci podręcznej procesora, ponieważ między dostępem w pamięci podręcznej a dostępem do pamięci głównej jest około 10.
Aby uzyskać pełne informacje na temat mechanizmów kryjących się za pamięcią podręczną, możesz przeczytać tę doskonałą serię artykułów pod numerem Ulrich Drepper on lwn.net.
W skrócie:
Cel LOCALITY
Nie należy skakać w pamięci, więc spróbuj (jeśli to możliwe) do grupowania elementów, które będą używane razem.
Cel na Przewidywalność
Jeśli dostępów pamięci są przewidywalne, CPU będzie prawdopodobnie wstępne pobieranie pamięć na następny kawałek pracy, tak, że jest on dostępny natychmiast, lub wkrótce po zakończeniu bieżącego klocek.
Typowym przykładem jest z for
pętli na tablicach:
for (int i = 0; i != MAX; ++i)
for (int j = 0; j != MAX; ++j)
array[i][j] += 1;
Zmiany array[i][j] += 1;
z array[j][i] += 1;
a wydajność waha się ... na poziomie niskim optymalizacyjnych;)
Kompilator powinien nadrobić te oczywiste przypadki, ale niektóre są bardziej podstępne. Na przykład użycie kontenerów opartych na węźle (listy połączone, drzewa wyszukiwania binarnego) zamiast kontenerów opartych na tablicach (wektor, niektóre tabele mieszania) może spowolnić działanie aplikacji.
nie trać miejsca ... Strzeżcie się fałszywych dzielenia
Spróbuj spakować struktury. Ma to związek z wyrównaniem, a użytkownik może marnować przestrzeń z powodu problemów z dopasowaniem w strukturach, które sztucznie zawyżają rozmiar struktury i zajmują miejsce w pamięci podręcznej.
Typową regułą jest zamawianie elementów w strukturze poprzez zmniejszanie rozmiaru (użyj sizeof
). To jest głupie, ale działa dobrze. Jeśli masz większą wiedzę na temat rozmiaru i wyrównania, po prostu unikaj dziur :) Uwaga: przydatne tylko w przypadku struktury z wieloma przypadkami ...
Należy jednak uważać na fałszywe udostępnianie. W programach z wieloma wątkami równoczesny dostęp do dwóch zmiennych, które są wystarczająco blisko, aby współdzielić tę samą linię pamięci podręcznej, jest kosztowny, ponieważ wiąże się z wieloma unieważnieniami pamięci podręcznej i walką z CPU o własność linii pamięci podręcznej.
profilu
Niestety, jest to HARD do rozszyfrowania.
Jeśli programujesz na Unixie, Callgrind
(część zestawu Valgrind) można uruchomić z symulacją pamięci podręcznej i zidentyfikować fragmenty kodu powodujące chybienia pamięci podręcznej.
Sądzę, że są inne narzędzia, których po prostu nigdy nie używałem.
Jeśli musisz zadawać takie pytania, lepiej skup się na funkcjach i projektowaniu na wysokim poziomie, zamiast zgadywać na niskim poziomie szczegółów, ponieważ prawdopodobnie i tak niewiele osiągniesz. I nawet gdybyś wiedział, co robisz na tym poziomie, (1) wydajność ma niższy priorytet, niż rzeczy faktycznie zrobione i (2) są to mikrooptymalizacje, które z natury przynoszą tylko drobne ulepszenia. – delnan
Czy Twoje pytanie dotyczy rzeczywistej poprawy szybkości dostępu do pamięci lub ogólnego sprawnego projektowania różnych aspektów (alokacji, dealokacji, segmentacji itp.) Modułu zarządzania pamięcią? – FireAphis