AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Gibt es ein Schnelleres verfahren als Min?
Thema durchsuchen
Ansicht
Themen-Optionen

Gibt es ein Schnelleres verfahren als Min?

Ein Thema von Hallo_Thomas · begonnen am 17. Jun 2005 · letzter Beitrag vom 18. Jun 2005
Antwort Antwort
Seite 3 von 3     123   
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#21

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 17. Jun 2005, 21:45
Wie wird für MinArrayValue der Befehl richtig geschrieben?


Counter[145]:= MinArrayValue(Counter[48],(Counter[50],Counter[52]);
Fehlermeldung, undefinierter bezeichner 'MinArrayValue'
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#22

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 17. Jun 2005, 21:48
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" .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#23

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 17. Jun 2005, 21:49
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? 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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#24

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 17. Jun 2005, 21:58
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 . 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).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#25

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 17. Jun 2005, 22:35
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...
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#26

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 18. Jun 2005, 00:29
Kannst auch direkt den Code aus Min() nehmen
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;
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#27

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 18. Jun 2005, 04:43
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 ).
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#28

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 18. Jun 2005, 13:42
Jetzt natürlich noch der Vergleichstest mit inline :
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 .
Obwohl die Testzeiten ziemlich unterschiedlich ausfielen (Inline: 38 - 50 s), war die Inline Methode doch immer 3 - 7 Sekunden schneller.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#29

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 18. Jun 2005, 18:08
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#30

Re: Gibt es ein Schnelleres verfahren als Min?

  Alt 18. Jun 2005, 18:32
Zitat von Khabarakh:
Das hat mich jetzt doch etwas überrascht .
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? Was kann den Delphi da noch optimieren?

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz