Widzę, ze dużo szczegółów padło
- co może i prawdopodobnie będzie zoptymalizowane
- żeby nie używać "ręcznego" kodu
- profilowanie, a nie domysły
Dodam, do gorącej herbaty, że nie ma zamienności zmiennych w klasie i zmiennych lokalnych w metodzie. Powiem jeszcze bardziej, nie ma zmiennych w klasie, a są pola.
To trzeba sobie mocno w głowie oddzielić. Pola są informacją o wiele bardziej trwałą, niż doraźne zmienne.
Po rozdzieleniu w głowie j/w drugi temat: nazwy. O ile ix
jest dla mnie 'spoko' nazwą zmiennej lokalnej o zakresie 3 linii, to fatalną nazwą pola (czy zmiennej o dużym zakresie).
Źle użyta nazwa ma razić, nie dać spać itd i nakłonić do refaktoringu.
Tak się składa, że w 95% przypadków dążenie do czytelnego, stylowego kodu polepsza optymalizację (pozostałe 5% to dodanie poziomu abstrakcji, może nieco osłabić szybkosć).
Na gruncie tego wątku: najbardziej lokalny charakter zmiennych, jaki jest możliwy, jest czynnością ku dobremu stylowi, i daje kompilatorowi okazję optymalizacji. Współczesny CPU ma więcej rejestrów niż dawniej, ale dalej to skończona ilość, niech tam pracują zmienne najbardziej lokalne.
Dodam, że arytmetyka wskaźnikowa to przypuszczalnie była szybsza od indeksowej (tablicowej), ale to było trzydzieści lat temu.
for (; In < In_RowEnd; In++, Out++) *Out = *In;
to nie tylko można zastąpić funkcją z karty graficznej, ale memcpy
czy czymś, co się zinlinuje.
Po (drugie??? chyba już siedemnasta myśl), wątpię, by porównanie końca zakresu na wskaźnikach było szybsze niż na integerach integerze (jednym), chętnie o mniejszym zakresie (i zmienne silnie lokalne).
Dwa długie inkrementy, zamiast jednego (krótkiego) itd Ten zapis ma jeden cel: czuć się jak hacker.
Gdybym miał pisac ręcznie, bym dał:
for(short i=0; i< row_length; i++) a[i] = b[i];
Z drobiazgów, które są pro-stylowe, a dają kompilatorowi szanse do wykazania się, są const
i constexpr
@Wibowit wolał bym, zebyś wycofał się z porady
prawdopodobnie wskaźnik this nie jest restrict, więc spróbuj zamienić metodę void Image::Draw(int iX, int iY) na statyczną,
Ta klasa ma przed sobą DUŻY zakres analizy, co jest polem, jakim jest polem itd, niech to najpierw się stanie. W sumie, to nie ma pewności czy klasa to naprawdę Image
, czy coś innego (ImageBuffer ?) a metoda to Draw
. Na pewno w obecnym kształcie nie jest to klasa, która da się użyć w grze, poza testem wydajnościowym - tu jeszcze wiele będzie się działo