![]() |
Performanz von verschachtelte if- Abfragen
Ich als relativer Programmieranfänger hab da ma eine Frage. Kostet es eigentlich viel Zeit, eine if Abfrage die 3-4 'and' oder 'or' benutzt zu durchlaufen?
Ich habe mal einen Profiler über mein Programm laufen lassen und ich frag mich, ob eine Methode die einiges an if Abfragen enthält, auch unter anderem deswegen einen Großteil der Laufzeit ausmacht oder ob das nur daran liegt das diese sehr oft aufgerufen wird? Schonmal danke :)! Liebe Grüße, daschaos |
Re: Performanz von verschachtelte if- Abfragen
Kommt auf die Bedingungen an.
Du kannst ja in einer Bedingung 3 Stunden nach irgendetwas suchen, oder eine Web-Anfrage starten oder sonstwas. Die Rechenzeit für die Abarbeitung bzw. Verknüpfung per OR/AND dürfte im Nanosekundenbereich anzusiedeln sein. |
Re: Performanz von verschachtelte if- Abfragen
Das heißt wenn sich das lediglich um einfache Abfragen, wie zum Beispiel ob der Wert über 0 liegt oder eine Variable wahr oder falsch ist, es nicht so schlimm ist?
|
Re: Performanz von verschachtelte if- Abfragen
Nein. Wie willst du es denn anders machen.
[Ein nichtgeschriebenes Programm läuft immer deutlich schneller als ein geschriebenes Programm. Aber die Unterschiede im Ergebniss sind verblüffend. :mrgreen:] Wenn die Abfragen nötig sind, dann musst du sie eben machen. Aufhalten tun sie dein Programm nicht. Du könntest nur noch darüber nachdenken, wie du die Reihenfolge in den BEdingungen gestaltest. Denn unter Umständen (wenn das Endergebnis schon fest steht und keine weiteren Funktionen unter den Bedingungen sind) wird die Abfrage schon vorher abgebrochen. |
Re: Performanz von verschachtelte if- Abfragen
Ok, danke! Aber stimmt, ich könnte die Reihenfolge eventuell noch etwas umstellen...
|
Re: Performanz von verschachtelte if- Abfragen
Das müsste sehr schnell gehen. Du kannst das selbst testen, wenn du magst (Vorgehensweise ungetestet):
Delphi-Quellcode:
Die Dauer des Aufrufs von GetTickCount und die Abfrage i = 1 beeinflussen das Ergebnis natürlich minimal, aber grob kannst du feststellen, wie lange was nun benötigt.
var
Start1, Start2: Integer; i: Integer; begin Start1 := GetTickCount(); for i := 1 to 100000 do begin Start2 := GetTickCount(); if (a and b and c) then begin end; if i = 1 then ShowMessage(IntToStr(GetTickCount() - Start2)); // Zeit, die eine if-Anweisung benötigt end; ShowMessage(IntToStr(GetTickCount() - Start1)); // Zeit, die alle if-Anweisungen benötigen end; |
Re: Performanz von verschachtelte if- Abfragen
Wenn die gleichen Bedingungen oder Teilausdrücke mehrfach auf gefragt werden dann kann man diese
auch vorab in einer Variable vom Typ Boolean ablegen.
Delphi-Quellcode:
// Wenn also immer wieder so etwas auftaucht:
if (x >= minx) and (x <= maxx) and .... then // dann gibt es eine Vereinfachung var ValidX : boolean; ... ValidX := (x >= minx) and (x <= maxx); if ValidX and .... then |
Re: Performanz von verschachtelte if- Abfragen
Ja, in der Tat. Oh Mann, auf sowas könnt ich auch ma kommen. Danke danke danke! Ich muss noch soviel lernen ;).
|
Re: Performanz von verschachtelte if- Abfragen
wobei der code bei showmessage angehalten wird, dh bei Matzes Beispiel stimmt das zweite showmessage mit der gesamtzeit nicht.
|
Re: Performanz von verschachtelte if- Abfragen
Wobei sich ShowMessage an sich schon die Performance verschlechtert
|
Re: Performanz von verschachtelte if- Abfragen
Zitat:
Delphi-Quellcode:
Ich wage zu bezweifeln, dass der Compiler das nicht wegoptimiert.
if (a and b and c) then
begin end; |
Re: Performanz von verschachtelte if- Abfragen
@Dominik/Markus: Stimmt. Wie bereits geschrieben, das soll nur das Vorgehen sein, die Umsetzung müsste etwas anders aussehen.
@NamenLozer: Das sind eben seine Bedingungen. Ich weiß nicht, wie diese aussehen. Das können Funktionsaufrufe sein und ähnliches. |
Re: Performanz von verschachtelte if- Abfragen
Hi Matze,
das meinte ich nicht. Wenn in der if-abfrage kein code steht wird die gesamte if-abfrage sicherlich wegoptimiert. Wenn da aber was drinsteht ist das Ergebnis verfälscht. Es sei denn man macht darin eine zweite Zeitmessung - Die braucht aber auch wieder Zeit :mrgreen: |
Re: Performanz von verschachtelte if- Abfragen
Zitat:
|
Re: Performanz von verschachtelte if- Abfragen
so hier ein test:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Zeit1, Zeit2: Cardinal; I, Dummy: Integer; const Durchläufe = 100000000000; begin Dummy := 0; Zeit1 := GetTickCount; for I := 0 to Durchläufe do if I <= Durchläufe then Inc(Dummy); Zeit1 := GetTickCount - Zeit1; Dummy := 0; Zeit2 := GetTickCount; for I := 0 to Durchläufe do Inc(Dummy); Zeit2 := GetTickCount - Zeit2; showmessage(Format('Ich habe für %d if-Abfragen %d Millisekunden benötigt!'#13#10+ 'Das sind %12.10f Millisekunden pro if-Abfrage!', [Durchläufe, (Zeit1 - Zeit2), ((Zeit1 - Zeit2) / Durchläufe)])); end; |
Re: Performanz von verschachtelte if- Abfragen
Ok, das probier ich auch mal aus! Danke für eure schnellen Antworten!
Findet man eigentlich auch so allgemeine Tipps zur Codeoptimierung irgendwo? Wie zum Beispiel das Sortieren der if- Abfragen nach Abbruchkriterium etc. was hier so vorgeschlagen wurde? Sicher ist es nich immer einfach, alles zu verallgemeinern, aber so ein paar generelle Dinge, was man irgendwie beachten könnte?! Das wäre toll... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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