Dabei kommt es mir wirklich auf jede microsekunde an. Jetzt habe ich mich mal mit dem Assembler-Output des PB-Kompilats beschäftigt.
Ich bin wahrlich kein Assembler-Profi; aber über das, was ich da teilweise so gesehen habe, kann ich nur den Kopf schütteln!
z.B:
Code: Alles auswählen
K4(a1,a2,a3,a4)-1Code: Alles auswählen
MOV edx,dword [a_K4+4]
IMUL edx,dword [v_a1]
MOV ebp,edx
MOV edx,dword [a_K4+8]
IMUL edx,dword [v_a2]
ADD ebp,edx
MOV edx,dword [a_K4+12]
IMUL edx,dword [v_a3]
ADD ebp,edx
PUSH ebp
MOV eax,dword [v_a4]
POP ebp
ADD ebp,eax
SAL ebp,2
ADD ebp,dword [a_K4]
MOV ebx,dword [ebp]
DEC ebx
PUSH ebx
MOV edx,dword [a_K4+4]
IMUL edx,dword [v_a1]
MOV ebp,edx
MOV edx,dword [a_K4+8]
IMUL edx,dword [v_a2]
ADD ebp,edx
MOV edx,dword [a_K4+12]
IMUL edx,dword [v_a3]
ADD ebp,edx
PUSH ebp
MOV eax,dword [v_a4]
POP ebp
ADD ebp,eax
SAL ebp,2
ADD ebp,dword [a_K4]
POP dword [ebp]Das könnte ich ja (gerade noch) verstehen, wenn der PB-Code lauten würde:
Code: Alles auswählen
K4(a1,a2,a3,a4) = K4(a1,a2,a3,a4) -1Der optimale Code würde so aussehen:
Code: Alles auswählen
MOV edx,dword [a_K4+4]
IMUL edx,dword [v_a1]
MOV ebp,edx
MOV edx,dword [a_K4+8]
IMUL edx,dword [v_a2]
ADD ebp,edx
MOV edx,dword [a_K4+12]
IMUL edx,dword [v_a3]
ADD ebp,edx
PUSH ebp
MOV eax,dword [v_a4]
POP ebp
ADD ebp,eax
SAL ebp,2
ADD ebp,dword [a_K4]
MOV ebx,dword [ebp]
DEC ebx
PUSH ebx
POP dword [ebp]Dann sind mir noch andere Sachen aufgefallen, die nicht so schön gelöst sind (z.B. Jump, der auf einen Jump springt, der auf einen Jump springt, der auf einen Jump springt...furchtbar). Und wer PEEK/Poke benutzt im Glauben, damit Geschwindigkeit zu gewinnen...für den wäre ein Blick in den Assembler-Output sehr abschreckend!
So, so....Referenz-Handbuch hat geschrieben:"...der generierte Code produziert ein optimiertes Executable."
