ASM - Compiler erstellt überflüssigen Code?
Liste der Anhänge anzeigen (Anzahl: 1)
Spät-Mahlzeit!
Es ist zwar nur eine klitze Kleinigkeit, aber ich habe mich gerade beim Durchsteppen im CPU-Fenster etwas gewundert. Die im Bild (im Anhang) rot umrandete Zeile dürfte ja eigentlich nie erreicht werden, da direkt zuvor ein ret steht (der auch zum sofortigen Sprung führt, klar). Die Zeile wird tatsächlich nie erreicht - die Unit ist recht klein, und ein komplettes Durchsteppen landete nicht ein mal dort. Warum aber existiert diese Zeile dann? Sie gehört auch nicht zur Folgeprozedur. Sie wird folglich nicht benötigt, und belegt nur Plattenplatz + RAM. Das ist für eine einzige Anweisung zwar Lachhaft, ich weiss, aber ich frage mich wie viel es wohl in größeren Projekten ausmachen könnte. Ist da etwa noch offensichtliches Optimierungspotential im Compiler? Oder ist das ganz besonders schlau von Delphi, weil damit evtl. günstigeres Alignment erreicht wird? Kein Plan. Aber Interesse dran! Ich weiss dass das ziemlich kleinlich klingt, aber irgendwie stört es mich grad :D. |
Re: ASM - Compiler erstellt überflüssigen Code?
es handelt sich wahrscheinlich um eine variable, die der compiler an den prozedur code anhängt.
dass da LEA EAX... steht ist reiner zufall da der wert halt dieser anweisung entspricht btw.. seit wann hast du das matrix-zeuch in deinem logo ? |
Re: ASM - Compiler erstellt überflüssigen Code?
Zitat:
|
Re: ASM - Compiler erstellt überflüssigen Code?
Zitat:
|
Re: ASM - Compiler erstellt überflüssigen Code?
Zitat:
edit: oder ein Word und das 00 noch angehängt um auf die schöne durch 4 teilbare addy zu kommen... |
Re: ASM - Compiler erstellt überflüssigen Code?
Das ist schon eine nahezu perfekte Optimierung. Die umrahmten Bytes sind einfach da, das ist Absicht. Die nächste Anweisung ist so an einer DWORD-Adresse, was Sprünge oder Calls einen Speedvorteil bringen kann. Mach mal einen Test: Nimm dir die Funktion
Delphi-Quellcode:
Und teste sie durch, indem du einmal CALL Test aufrufst und im anderen Fall eben so:
procedure Test;
asm nop inc eax ret end;
Delphi-Quellcode:
Beides führt den selben Code aus, aber nur CALL Test wird direkt eine DWORD-Adresse aufrufen. Dürfte also schneller sein ;-)
asm
lea edx, Test inc edx end; // Weiterer Testcode asm call edx end; PS: Ich hab's nicht getestet. Noch nicht ;-) @retnyg: Wenn es Variablen wären (die drei umrahmten Bytes), müsste das Programm schreibrechte auf die Daten um EIP haben. Ist aber nicht der Fall, also können es keine Variablen sein. |
Re: ASM - Compiler erstellt überflüssigen Code?
@jbg: Das war nur eine völlig geratene Vermutung. Ob das überhaupt von Belang wäre weiss ich ja nichtmal :)
@retnyg: Hmmm, das könnte an sich sein. Jedoch würde ich eher Konstanten in dieser Form erwarten, und solche kommen in beiden Prozeduren nicht vor (zumindest keine die diesem Wert entsprächen). Zudem sind es alles lokale Variablen (die ja auf dem Stack rumlungern dürften :)), womit ein Pointer auf einen Wert auch nicht allzu plausibel erscheint. Aber an sich klingt das nach einer wahrscheinlichen Sache... Die beiden zugerörigen Prozeduren mal in DL:
Delphi-Quellcode:
Die betreffende ASM-Zeile steht quasi zwischen diesen beiden Prozeduren, beim Pfeil.
function FillZero(const s: String; const count: Integer): String;
var oldL: Integer; i : Integer; begin oldL := Length(s); SetLength(result, count); for i := 1 to count-oldL do result[i] := '0'; for i := count-oldL+1 to count do result[i] := s[i-count+oldL]; end; // <----------- procedure TfrmVorlage.FillVerfuegbar; var s: array[0..7] of String; begin lbVerfuegbar.Items.Clear; QryVerfuegbar.First; while not QryVerfuegbar.Eof do begin s[0] := QryVerfuegbar.FieldValues['N00']; s[1] := QryVerfuegbar.FieldValues['N01']; s[2] := QryVerfuegbar.FieldValues['N02']; s[3] := QryVerfuegbar.FieldValues['N03']; s[4] := QryVerfuegbar.FieldValues['EArt']; s[5] := QryVerfuegbar.FieldValues['Def']; s[6] := QryVerfuegbar.FieldValues['N04']; s[7] := QryVerfuegbar.FieldValues['Text']; lbVerfuegbar.Items.Add(FillZero(s[0], 2) + '-' + FillZero(s[1], 2) + '-' + FillZero(s[2], 2) + '-' + FillZero(s[3], 2) + '-' + s[4] + '-' + s[5] + FillZero(s[6], 4) + ' ' + s[7]); QryVerfuegbar.Next; end; end; \\EDIT: @Dax :love: : Also tatsächlich wirklich Alignment... ist ja nen Dingen! Hat das wirklich merkbaren Einfluss auf die Geschwindigkeit? Ich hatte hier mal irgendwo soetwas gelesen, allerdings in Bezug auf Datenalignment und den Zugriff darauf. (Wobei ein Call ja eigentlich nix anderes ist. Sitmmt schon... :gruebel:) |
Re: ASM - Compiler erstellt überflüssigen Code?
Zitat:
|
Re: ASM - Compiler erstellt überflüssigen Code?
Ich bastele schon ein paar Wochen an einer Möglichkeit, Schreibrechte auf's Codesegment zu bekommen, bis jetzt hatte ich keinen Erfolg ;-)
|
Re: ASM - Compiler erstellt überflüssigen Code?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz