Autor Beitrag
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 02.05.08 00:17 
Hi!
Beim Performancevergleich einiger Befehle ist mir etwas merkwürdiges aufgefallen.
Inkrementiere oder dekrementiere ich im folgenden Beispiel die Variable i, so benötigt die Routine laut GetTickCount-Zähler weniger Zeit, als wenn ich dies nicht tue! :?
Das ganze habe ich nun mehrfach ausprobiert. Für die Variante mit Änderung d. Var. benötigt das Programm auf meinem Rechner gut 500ms weniger.


Anbei, inc oder dec hat in diesem Fall den selben Effekt wie i := i +/- a! mit a = 0,1,2,3..n
Zudem taucht dieses Phänomen nur auf, wenn ich vorher das X negiere. :roll:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
 i,x: integer;
 s: integer;
begin
  s := gettickcount;

  for x := 1 to high(integer) do begin
   i := -x;
   i := i + 0// <-- verfälscht oder beschleunigt? 
  end;

  s := gettickcount - s;
...
Über den Sinn und Zweck des Programmes lässt sich diskutieren... ;)
Hat aber wer eine Idee, wie dies zustande kommen könnte? :)
Kann jemand das Problem reproduzieren?

Cheers,
Marc
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Fr 02.05.08 07:46 
Schau mal im CPU-Fenster ob durch die Änderung für i jetzt ein Register verwendet wird.
Marc. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 02.05.08 15:40 
Hi!
Vorher wurde bereits das EBX-Register für i verwendet.
Ich hab mal die Prozedur selbst in ASM umgeschrieben:
ausblenden Delphi-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:
procedure test;
label loopit;
var
 i: integer;
 s: integer;
begin
  asm
    call GetTickCount  // Zeit in EAX
    mov  esi, eax
    mov  ecx, $00000001

loopit:
    mov ebx, ecx
    add ebx, $00      // <-- Fehlt diese Zeile wird d. Differenz eax-esi um 500 größer!
    neg ebx
    inc ecx
    cmp ecx, $80000000
    jne loopit

    call GetTickCount // Zeit in EAX
    sub  eax, esi
    mov    s, eax
    mov    i, ebx
  end;

  form1.listbox1.items.add(inttostr(i));
  form1.listbox1.items.add(Format('zeit: %d',[s]));
end;

Wenn ich mich nun nicht absolut verguckt habe, übernimmt der Compiler den Code auch 1:1!
Hat jemand eine Erklärung dafür, weshalb die Differenz eax esi größer wird, wenn ich auf das Regsiter EBX zugreife?
Dort könnte übrigens auch imul anstelle von add oder sub stehen. Hat alles den gleichen Effekt. :?
Bin etwas Ratlos.
Einloggen, um Attachments anzusehen!
Marc. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 06.05.08 12:00 
Hat keiner eine Idee oder kann wenigstens das Besagte reproduzieren? :)