Przedwczesna optymalizacja

Patrzę dziś z łezką w oku na kod, który napisałem w Pascalu na początku 1998. roku (czyli gdzieś w pierwszej klasie ogólniaka):

procedure putpixel(x,y:word;color:word); assembler;
asm
  mov cx,640*2
  mov bx,x
  cmp bx,639
  ja @noput
  mov ax,y
  cmp ax,479
  ja @noput
  add ax,topscreeny
  mul cx
  shl bx,1
  add ax,bx
  adc dx,0
  mov si,ax
  cmp dl,curbank
  je @bankok
  call dword ptr bankswitch
  mov curbank,dl
@bankok:
  push $a000
  pop es
  mov ax,color
  mov es:[si],ax
@noput:
end;

I śmiać mi się chce, kiedy w oknie obok widzę kod, który dziś mam po kimś poprawiać:

for ($i = 0, $j = 0; ; )
{
	$tab[$i++] = $title[$j];
	$tab[$i++] = $content[$j++];
	if ($j >= $limit)
		break;
}

Nie wiedziałem, że czas procesora jest aż tak cenny w zagnieżdżanych językach skryptowych. Pół biedy z tym, ale widziałem już takie krzaki na ekranie, że sam autor by mi dziś nie powiedział, co kod robi bez pomocy debugowania.

5 » odpowiedzi dla wpisu “Przedwczesna optymalizacja”


  1. 1 Carstein

    Najlepsze jaja, z tego co słyszałem są we flashu. Znajomy ostatnio sporo pisze w tym czymś, to się nasłuchałem.

    Jak wiadomo przy graficę 3D sporo się wykonuje funkcji trygonometrycznych. Jeśli trzeba je wykonać wielokrotnie, to warto sobie poszczególne wyniki tablicować i potem się odwoływać do tablicy. Otóż okazuje się, że odwołanie się do elementu tablicy jest we flashu wolniejsze, niż wywołanie funkcji trygonometrycznej z zewnętrznej biblioteki.

    Ponoć cały flash jest naszpikowany takimi motywami.

  2. 2 Jam Łasica RF

    Moja funkcja była znacznie bardziej WTF

    [snip]

    les di,G_Buf

    add di,&CX

    mov ax,CY

    shl ax,6

    add di,ax

    shl ax,2

    add di,ax

    mov ax,G_Color

    mov es:[di],al

    [snip]

    Potem już tylko wystarczy wrzucić bufor do karty (z obsługą synchronizacji pionowej)

    cmp G_VSync,0

    je @@3

    @@1:

    mov dx,03dah

    in al,dx

    test al,8

    jne @@1

    @@2:

    in al,dx

    test al,8

    je @@2

    @@3:

    push ds

    mov ax,0a000h

    mov es,ax

    xor di,di

    lds si,G_Buf

    mov cx,(MAX_BUF_SIZE / 4)

    cld

    db 66h

    rep movsw

    pop ds

    :)

  3. 3 Patrys

    Hmm, twoja funkcja działa tylko dla 320×200x256 :P

    U siebie też jakiś miesiąc później zamieniłem mnożenie na przesunięcia bitowe i składanie. Tylko, że nie chodzi tu o najładniejszą funkcję do rysowania pikselami po ekranie. Chodzi o to, że to już nie te czasy, kiedy się pisało wstawki w assemblerze.

  4. 4 Jam Łasica RF

    To była biblioteka do gry, którą kiedyś pisałem pod DOS-em. Co ciekawe można tą grę kupić na Allegro razem z GIMPem, Firefoxem, OpenOffice i innymi otwartymi programami :D

  5. 5 Tomash

    W tym roku czeka mnie poznawanie assemblera (przedmiot Sterowanie Eksperymentem Fizycznym)… już się cieszę na samą myśl ;]

Skomentuj wpis