![]() |
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' |
Re: Gibt es ein Schnelleres verfahren als Min?
Delphi-Quellcode:
@SirThornberry: Stimmt, daran hatte ich gar nicht gedacht. Aber bei so wenig Code kann man die Funktion ja auch selbst "inlinen" .
Counter[145] := MinIntValue([Counter[48], Counter[50], Counter[52]]);
|
Re: Gibt es ein Schnelleres verfahren als Min?
Zitat:
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 |
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). |
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:
Ich habe die beiden Möglichkeiten jeweils eine Milliarde mal durchlaufen lassen und Version 1 war doppelt so schnell :!:
//i1, i2, e1, e2 sind Integer
//Version 1 if i1-i2 < 0 then e1 := i1 else e1 := i2; //Version 2 e2 := min(i1,i2); (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... |
Re: Gibt es ein Schnelleres verfahren als Min?
Kannst auch direkt den Code aus Min() nehmen
Delphi-Quellcode:
Ist genauso schnell, wie deiner, obwohl Min() selber ja nichts anderes macht
if i1 < i2 then e1 := i1 else e1 := i2;
Delphi-Quellcode:
:gruebel:
function Min(const A, B: Integer): Integer;
begin if A < B then Result := A else Result := B; end; |
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 ;)). |
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:
Zitat:
Obwohl die Testzeiten ziemlich unterschiedlich ausfielen (Inline: 38 - 50 s), war die Inline Methode doch immer 3 - 7 Sekunden schneller. |
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 |
Re: Gibt es ein Schnelleres verfahren als Min?
Zitat:
mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr. |
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