Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Algorithmusoptimierung Zahlentypen
Coder - Mi 10.01.07 00:46
Titel: Algorithmusoptimierung Zahlentypen
Hi
Hat es einen performancetechnischen Nachteil wenn ich als for-Schleifen-Zähler-Variable einen Integer nehme, wenn Byte auch ginge?
Ähm, und wie groß ist Byte nochmal max.?
Meine Delphi-Hilfe ist abgeraucht. :(
MfG
Moderiert von
Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 10.01.2007 um 00:27
Narses - Mi 10.01.07 00:53
Moin!
Coder hat folgendes geschrieben: |
Hat es einen performancetechnischen Nachteil wenn ich als for-Schleifen-Zähler-Variable einen Integer nehme, wenn Byte auch ginge? |
Kann ich mir bei der Bus- und Registerbreite aktueller CPUs nicht vorstellen; da dürfte vermutlich im ASM kein Unterschied mehr sein (wenn, dann ist Byte langsamer :D)!
Coder hat folgendes geschrieben: |
Ähm, und wie groß ist Byte nochmal max.? |
:? Das ist aber schon eher eine peinliche Frage... :P
1 Byte = 8 Bit = 2^8 = 256 -> 0..255 :mahn: ;)
cu
Narses
jaenicke - Mi 10.01.07 00:53
Byte: 8 Bit, also bis 255...
Und du kannst ruhig Integer nehmen, denn letztendlich landet ja der Integer-Wert ohnehin in ECX, also dem Extended-Counter-Register der CPU. Genauso landet der Byte-Wert in CL, also den ersten 8 Bit des Counter-Registers. Und dann wird jeweils eins abgezogen bis der Wert 0 erreicht ist. Das ist nur ein Befehl, egal ob auf ein Byte bezogen oder auf die 4 Byte eines Integer-Werts, also auf das Extended Register.
Jedenfalls ist es eigentlich so, ob Delphi das auch so macht, kann ich jetzt nicht ganz genau sagen (also mit CL und so), aber ich probiers schnell mal aus, was der Delphi-Compiler da draus macht.
// EDIT: :lol: Ja, hier gibts ein Echo...
jaenicke - Mi 10.01.07 01:26
Es macht in der Tat keinen Unterschied.
Aus
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm54.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to e2 do tmp2 := tmp2 + i; end;
procedure TForm54.Button2Click(Sender: TObject); var i: Byte; begin for i := 0 to e1 do tmp1 := tmp1 + i; end; |
wird
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| Unit54.pas.36: for i := 0 to e2 do 00453264 A1D0664500 mov eax,[$004566d0] 00453269 85C0 test eax,eax 0045326B 7C0D jl $0045327a 0045326D 40 inc eax 0045326E 33D2 xor edx,edx Unit54.pas.37: tmp2 := tmp2 + i; 00453270 0115D8664500 add [$004566d8],edx 00453276 42 inc edx Unit54.pas.36: for i := 0 to e2 do 00453277 48 dec eax 00453278 75F6 jnz $00453270 Unit54.pas.38: end; 0045327A C3 ret
0045327B 90 nop Unit54.pas.44: for i := 0 to e1 do 0045327C 0FB605CC664500 movzx eax,[$004566cc] 00453283 84C0 test al,al 00453285 720E jb $00453295 00453287 40 inc eax 00453288 B200 mov dl,$00 Unit54.pas.45: tmp1 := tmp1 + i; 0045328A 0015D4664500 add [$004566d4],dl 00453290 42 inc edx Unit54.pas.44: for i := 0 to e1 do 00453291 FEC8 dec al 00453293 75F5 jnz $0045328a Unit54.pas.46: end; 00453295 C3 ret |
Wie bereits erwähnt zählt das Programm in Wirklichkeit bis auf 0 herunter, obwohl es ja eigentlich laut Delphi-Quelltext so aussieht als würde es von 0 anfangen. Aber da es einfacher ist auf 0 zu testen wird, wann immer es möglich ist, die Schleife auf 0 herunter ausgeführt...
Jedenfalls siehst du ja, obwohl du vermutlich kein Assembler kannst, dass die beiden Prozeduren praktisch identisch umgesetzt sind. Der einzige Unterschied ist eben wie bereits von mir vermutet, dass eben nur ein Teil des jeweiligen Registers, nämlich der niederwertigste Teil, benutzt wird, wenn ich Byte benutze. Also z.B. eben nur DL, statt EDX.
EDX, das erweiterte Datenregister, ist 32-Bit breit, dabei sind die unteren 16 Bit das DX Register. Diese 16 Bit können wiederum auch als DH und DL benutzt werden, das heißt als zwei 8 Bit große Werte.
Langer Rede kurzer Sinn: Es macht keinen Unterschied, was die Performance angeht...
Coder - Mi 10.01.07 01:40
Wow, danke für die ausführliche Antwort! :D
Und das zu der Uhrzeit :lol:
Seit es Avatare gibt, merke ich das jaenicke ständig Fragen von mir beantwortet.
Danke!
Delete - Do 11.01.07 00:57
allgemein, wenn du auf die performance achten willst, solltest du datentypen verwenden welche die interne prozessorarchitektur am besten wiederspiegeln, diese sind sowohl in delphi als auch C die integer.
langer rede, kurzer sinn, mit einem Int (integer) fährst schneller als mit einerm byte... denn je nach prozessorarchitektur ist in int mal 2, 4, 8, 16, 32, 24, 32, 40, 56, 64... bit lang... so dass ein zähler einfach geladen und gezählt werden kann.
grüsse GG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!