Autor Beitrag
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: 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 user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 10.01.2007 um 00:27
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.01.07 00:53 
Moin!

user profile iconCoder 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)!

user profile iconCoder 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 10.01.07 01:26 
Es macht in der Tat keinen Unterschied.
Aus
ausblenden 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
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: 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!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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