Zitat:
Ein Compiler kann in den meisten aller Fälle besser optimieren, als der Programmierer von Hand
Was bedeuten würde das eine Maschine intelligenter als ein Mensch wäre. Dem stimme ich also nicht zu. Ein Mensch wird IMMER besseren Code erzeugen als ein Compiler, es ist nur eine Frage des Aufwand-Nutzen Verhältnisses dem der Mensch unterlegen ist. Das Problem ist das ein Mensch der einen Compiler übertrumpfen will exakt wissen muß wo der Compiler schlecht arbeitet. Nur wenn es dann offensichtlich ist das der Compiler ineffizienten Code erzeugen muß, zB. weil er neuere CPU Befehle nicht benutzt, lohnt sich der Einsatz von manuellem Assembler.
Was ich bisher sehen konnte ist in
Delphi-Quellcode:
mov al, Byte([esi].FColor) 1.)
mov
dl, [ebx] 2.)
sub eax, edx
mov Temp, eax 3.)
fild Temp
fmul FAC
sub esp, $04
fistp DWord Ptr[esp]
fwait 4.)
pop eax 5.)
add [ebx], al 6.)
1.) 8 Bit und 32 Bit Befehle und Speicherzugriffe werden vermischt. Dies ist auf 32 Bit CPU's tödlich.
2.) zwei Speicherzugriffe nacheinander und sofortiges benutzen dieser Register in SUB EAX,EDX ist tödliche für die CPU Pipelines, es wird Branches und Stalls geben da das SUB EAX,EDX auf die vorherigen langsammen Speicherzugriffsbefehle warten muß.
3.) ein Register wird wieder in den Stack gespeichert
4.) fwait kann raus, unter neueren CPU's > 286 eh sinnlos.
5.) Stack wird geupdated, POP bewirkt einen Speicherzugriff + ein Inkrement von ESP. besser also eine Stackvariable mit MOV EAX,[ESP] benutzen
6.) wieder ein 8 Bit Speicherzugriff
Gruß Hagen