Autor |
Beitrag |
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Mi 10.01.07 00:46
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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  )!
Coder hat folgendes geschrieben: | Ähm, und wie groß ist Byte nochmal max.? |
 Das ist aber schon eher eine peinliche Frage...
1 Byte = 8 Bit = 2^8 = 256 -> 0..255
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:  Ja, hier gibts ein Echo...
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 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 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Mi 10.01.07 01:40
Wow, danke für die ausführliche Antwort!
Und das zu der Uhrzeit
Seit es Avatare gibt, merke ich das jaenicke ständig Fragen von mir beantwortet.
Danke!
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
|
|
|