Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gibt es ein Schnelleres verfahren als Min? (https://www.delphipraxis.net/47910-gibt-es-ein-schnelleres-verfahren-als-min.html)

Hallo_Thomas 17. Jun 2005 20:45

Re: Gibt es ein Schnelleres verfahren als Min?
 
Wie wird für MinArrayValue der Befehl richtig geschrieben?


Delphi-Quellcode:
Counter[145]:= MinArrayValue(Counter[48],(Counter[50],Counter[52]);

Fehlermeldung, undefinierter bezeichner 'MinArrayValue'

Khabarakh 17. Jun 2005 20:48

Re: Gibt es ein Schnelleres verfahren als Min?
 
Delphi-Quellcode:
Counter[145] := MinIntValue([Counter[48], Counter[50], Counter[52]]);
@SirThornberry: Stimmt, daran hatte ich gar nicht gedacht. Aber bei so wenig Code kann man die Funktion ja auch selbst "inlinen" .

r2c2 17. Jun 2005 20:49

Re: Gibt es ein Schnelleres verfahren als Min?
 
Zitat:

Zitat von Khabarakh
Das sollte sich aber per inline; aber wieder relativieren, oder?

Inline?
a) dachte ich das gibts erst ab D2005 und
b) glaube ich nicht, dass Borland Min inline deklariert hat, oder hab ich inline falsch verstanden und man kann das direkt mit dem Funktionsaufruf verbinden? :gruebel: Eigentlich unlogisch!
Man könnte sich auch selbst ne Min funktion schreiben, dann kan man die aber auch 1. direkt in den Code einbauen und 2. die iterative Methode verwenden(also möglichtst Rekusion vermeiden, wenns um Gerschwindigkeit geht).

mfg

Christian

Khabarakh 17. Jun 2005 20:58

Re: Gibt es ein Schnelleres verfahren als Min?
 
Zu a): Siehe oben
Zu b): Das Thema heißt ja "Gibt es ein Schnelleres verfahren als Min?", also sollten neue Funktionen nicht verboten sein :wink: . Die Möglichkeit zum "Per-Hand-Inline" habe ich auch schon genannt, ich denke auch, dass zwischen iterativer und rekursiver Methode fast kein Unterschied bestehen wird (der Compiler wird vielleicht eine Variable mehr benutzen).

Nicolai1234 17. Jun 2005 21:35

Re: Gibt es ein Schnelleres verfahren als Min?
 
Hallo,
ich habe gerade mal (spaßeshalber) einen Test gemacht, von dem ich mir nicht viel erhoffte... Aber jetzt bin ich doch sehr überrascht:
Delphi-Quellcode:
//i1, i2, e1, e2 sind Integer
//Version 1
if i1-i2 < 0 then e1 := i1 else e1 := i2;

//Version 2
e2 := min(i1,i2);
Ich habe die beiden Möglichkeiten jeweils eine Milliarde mal durchlaufen lassen und Version 1 war doppelt so schnell :!:
(Compileroptimierung in der Schleife sind ausgeschlossen!)

Mit 3 Variablen müsste man eben beides doppelt durchlaufen lassen, was den Zeitunterschied nochmals vedoppeln würde...

Woran kann das liegen? Das hieße ja, dass Min extrem langsam ist...

Pr0g 17. Jun 2005 23:29

Re: Gibt es ein Schnelleres verfahren als Min?
 
Kannst auch direkt den Code aus Min() nehmen
Delphi-Quellcode:
if i1 < i2 then e1 := i1 else e1 := i2;
Ist genauso schnell, wie deiner, obwohl Min() selber ja nichts anderes macht
Delphi-Quellcode:
function Min(const A, B: Integer): Integer;
begin
  if A < B then
    Result := A
  else
    Result := B;
end;
:gruebel:

dizzy 18. Jun 2005 03:43

Re: Gibt es ein Schnelleres verfahren als Min?
 
Alleine der Call dürfte hier durchaus mit 50% Geschwindigkeit zu Buche schlagen, da 2 Parameter gepushed/gemoved werden müssen, und der Call selbst. Viel mehr dürfte der asm-Code der eigentlichen Funktion auch nicht sein, so dass der Call sich anteilig sehr deutlich bemerkbar machen dürfte.
Inline ist schon das richtige Stichwort. Nur gibt es Inlining tatsächlich erst für Delphi .NET, weshalb man von Hand "inlinen" muss, d.h. einfach nicht die Funktion aufrufen, sondern ihren Quelltext dahin kopieren wo sonst der Call stünde (und Variablennamen anpassen ;)).

Khabarakh 18. Jun 2005 12:42

Re: Gibt es ein Schnelleres verfahren als Min?
 
Jetzt natürlich noch der Vergleichstest mit inline :wink: :
Delphi-Quellcode:
function Min(const A, B: Integer): Integer; inline;
begin
  if A < B then
    Result := A
  else
    Result := B;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Start, Stop, i, a, b, Outcome: Integer;
begin
  Start := GetTickCount;
  for i := 0 to 1000000000 do
  begin
    a := Random(245);
    b := Random(245);
    Outcome := Min(a, b);
  end;
  Stop := GetTickCount;
  ShowMessage(Format('Min inline: %f s',[(Stop - Start) / 1000]));
  Start := GetTickCount;
  for i := 0 to 1000000000 do
  begin
    a := Random(245);
    b := Random(245);
    if a < b then
      Outcome := a
    else
      Outcome := b;
  end;
  Stop := GetTickCount;
  ShowMessage(Format('Selfmade: %f s',[(Stop - Start) / 1000]));
end;
Zitat:

---------------------------
Project1
---------------------------
Min inline: 48,77 s
---------------------------
OK
---------------------------
Zitat:

---------------------------
Project1
---------------------------
Selfmade: 51,84 s
---------------------------
OK
---------------------------
Das hat mich jetzt doch etwas überrascht :stupid: .
Obwohl die Testzeiten ziemlich unterschiedlich ausfielen (Inline: 38 - 50 s), war die Inline Methode doch immer 3 - 7 Sekunden schneller.

r2c2 18. Jun 2005 17:08

Re: Gibt es ein Schnelleres verfahren als Min?
 
Ich würde so n Test nicht in FormCreate reinschreiben, nimm lieber n Button. Da beim Programmstart die CPU noch am Arbeiten sein kann, könnte das zu Messfehlern führen. Beeser in ButtonClick schreiben.

mfg

Christian

r2c2 18. Jun 2005 17:32

Re: Gibt es ein Schnelleres verfahren als Min?
 
Zitat:

Zitat von Khabarakh
Das hat mich jetzt doch etwas überrascht :stupid: .
Obwohl die Testzeiten ziemlich unterschiedlich ausfielen (Inline: 38 - 50 s), war die Inline Methode doch immer 3 - 7 Sekunden schneller.

Jetzt fragt sich nur, warum? :gruebel: Was kann den Delphi da noch optimieren?

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz