Zająłem się tylko i wyłącznie próbą sprofilowania tego.
http://eru.nutki.com/a8/prof
pograłem kilka sekund, i zrzuciłem profil gdzie idzie czas (w kolumnach: adres / numer instrukcji / ilość cykli). Warto to sobie posortować po drugiej lub trzeciej kolumnie, pomaga zidentyfikować "intensywne" obszary
http://eru.nutki.com/a8/game.asx
http://eru.nutki.com/a8/game.lst
http://eru.nutki.com/a8/game.lab
oryginalny game.asx rozszerzony o makra definiujące interesujące nas obszary - obszary brałem patrząc na prof
Wyniki (tylko obszary >1%, adres lo/hi, liczba cykli, udział procentowy, nazwa; obszary się nakładają, patrz lo/hi):
982a 9850 513250 1.06 NMI
2147 2188 1633402 3.39 E_214D
1be0 1bf5 1674630 3.47 E_1BFA
1b44 1bb7 1725336 3.58 E_1B92
1bd1 1c2e 2052481 4.25 BMPMIRROR
bd97 be32 2497068 5.18 SHFBMP3
21b9 22c4 5178095 10.73 E_21BF
1b2c 1b3a 9763442 20.24 E_1B7B
0000 0044 12227423 25.35 PUTSHAPE
1874 1c80 15759503 32.67 CODE_E_18C6_E_1C86
1607 1c80 15864855 32.89 CODE_E_1659_E_1C86
1c80 2d90 16314202 33.82 CODE_E_1C86_E_2D96
1607 2d90 32179057 66.71 CODE_E_1659_E_2D96
0000 ffff 48238851 100.00 GLOBAL
Szybka analiza:
- pushape warto optymalizować dalej
- e_1b7b zajmuje dużo bardzo. Kod wygląda tak:
E_1B7B mva (E_0049),y E_0400,x
mva (E_004B),y E_0500,x
iny
inx
bne E_1B7B
może warto zamienić to na
E_1B7B mva adres1,x E_0400,x
mva adres2,x E_0500,x
inx
bne E_1B7B
poprzez na sztywno ustawienie adres1 i adres2
- cześć cykli idzie nie wiadomo gdzie jeszcze (zwłaszcza te z obszaru e_1c86_e_2d96 - tam mamy zidentifikowane ~15% z ~34%), wymaga więcej profilowania, ale to jest trudne jak kod jest tak strasznie nieczytelny :)
- ogólnie, nie widać, żeby dało się przyspieszyć całość znacząco modyfikując jeden kawałek kodu :(