AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Lohnen sich If abfragen vor dem schreiben auf einen Wert?
Thema durchsuchen
Ansicht
Themen-Optionen

Lohnen sich If abfragen vor dem schreiben auf einen Wert?

Ein Thema von snow · begonnen am 25. Dez 2007 · letzter Beitrag vom 25. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#1

Lohnen sich If abfragen vor dem schreiben auf einen Wert?

  Alt 25. Dez 2007, 00:05
Hallo

Ich hab mal eine Frage und zwar.

Wenn ich in einer eigenden Komponente eine SetXXX procedure habe.

Loht es sich dann vor dem schreiben auf der variable zu überprüfen ob sich der neue wert von dem alten unterscheidet(preformancemäßig).


Hier mal als Beispiel...
Delphi-Quellcode:
procedure TBeispielComp.SetZahl2(Value: Integer);
begin
  if Value <> FZahl2 then
    FZahl2 := Value;
end;
gruß snow

Frohe Weihnachten
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 00:22
Zwar dauert das Schreiben auch seine Zeit, aber das Überprüfen auch. Du wirst also keine Zeitersparnis haben. Wobei die Frage ist ob es nur um einer Variable geht oder du pro Sekunde 10000 Variablen zuweisen willst. Hier könnte man sich Gedanken machen, aber nicht bei einzelnen Variablen.

Wahrscheinlich kommt deine Frage, weil du bei einem Stick festgestellt hast, daß das Schreiben x mal länger dauert wie lesen. Aber wir sprechen hier von Nanosekunden bei RAM.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 00:41
Im Normalfall wirbelt so ein if die Pipeline des Prozessors ordentlich durcheinander. Das hat zwar nicht allzugroße Auswirkungen, man sollte es aber berücksichtigen. Ein Speicherzugriff hingegen dauert schon so einige Zeit, ich würde mal schätzen je nach Leistungsfähigkeit des Prozessors zwischen 50 und 180 Taktzyklen. Das kostet natürlich richtig übel Zeit. Allerdings haben Prozessoren heutzutage natürlich ziemlich große Caches mit recht niedrigen Fehlzugriffsraten.

Man kann also wirklich sagen, dass sich diese beiden Varianten nicht viel nehmen. Vermutlich gibt es viel bessere Optimierungsmöglichkeiten im Rest des Codes, und die paar Nanosekunden hin oder her machen natürlich eh keinen spürbaren Unterschied, solange du das ganze nicht ein paar hunderttausendmal aufrufst. Ich würde die ohne if-Abfrage aus Gründen der Einfachheit bevorzugen.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 01:39
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, x: Integer;
  Start, Ende, Zeit: TDateTime;
begin
  x := 0;
  Start := Now;

  for i := 0 to 2147483647 do
  begin
    (*Variante 1: Hier wird der Wert nur ein einziges Mal übergeben*)
    if i = 0 then x := i;

    (*Variante 2: Hier wird der Wert jedes Mal übergeben*)
    //x := i;
  end;

  Ende := Now;
  Zeit := Ende - Start;

  ShowMessage('Fertig bei x = ' + IntToStr(x) + ^j + 'Dauer: ' + TimeToStr(Zeit));
end;
Hab mal schnell etwas gebastelt. Es geht zwar genauer, aber für grobe Berechnung reicht es.

Laut der Routine dauert es doppelt so lange bei 2147483647 Abfragen und nur einer Zuweiseung, als wenn der Wert 2147483647 Mal übergeben wird.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 02:47
Das ist auch kein Wunder, wenn man den Maschinencode vergleicht..
Delphi-Quellcode:
// EAX: i, EDX: x

// mit Prüfung

cmp eax, edx
je @@done
mov eax, edx
@@done:

// ohne Prüfung

mov eax, edx
Da die Sprungvorhersage bei modernen Prozessoren schon so sehr ausgereift ist, dass die Fehlerwahrscheinlichkeit bei statischen Daten gegen 0 geht, wirkt sich der Sprung kaum aus, so bleibt es bei CMP/MOV mit Prüfung und bei MOV ohne Prüfung. Wenn es später an fetter Brocken geht, sagen wir, Dateisystemobjekte, macht eine Prüfung aber durchaus Sinn: beschreiben beide Werte das selbe Objekt, tut man einfach nichts, tun sie nicht, räumt man das Objekt (möglicherweise kostspielig) auf, bevor man sich auf das neue festlegt.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 07:27
Zitat von snow:
.... ob sich der neue wert von dem alten unterscheidet(preformancemäßig). ...
Hai snow,

wegen der Geschwindigkeit wurde ja schon etwas gesagt. Ein Grund für eine solche Abfrage könnte sein das Du deiner Komponente ein OnChange-Ereigniss schenken möchtest wenn sich der Wert von FZahl2 ändert.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 09:50
In meinen Komponenten mache ich diese Abfragen dann, wenn eine Änderung größere Rechenoperationen wie z.B. Neuzeichnen auslöst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 09:55
Zitat von DeddyH:
In meinen Komponenten mache ich diese Abfragen dann, wenn eine Änderung größere Rechenoperationen wie z.B. Neuzeichnen auslöst.
Das ist ja auch mehr als logisch. Lieber ein paar Taktzyklen für die Abfrage verschwenden, als die ganze Power zum Rechnen und Neuzeichnen nutzen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 09:56
Eben
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#10

Re: Lohnen sich If abfragen vor dem schreiben auf einen Wert

  Alt 25. Dez 2007, 11:00
Zitat von Popov:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, x: Integer;
  Start, Ende, Zeit: TDateTime;
begin
  x := 0;
  Start := Now;

  for i := 0 to 2147483647 do
  begin
    (*Variante 1: Hier wird der Wert nur ein einziges Mal übergeben*)
    if i = 0 then x := i;

    (*Variante 2: Hier wird der Wert jedes Mal übergeben*)
    //x := i;
  end;

  Ende := Now;
  Zeit := Ende - Start;

  ShowMessage('Fertig bei x = ' + IntToStr(x) + ^j + 'Dauer: ' + TimeToStr(Zeit));
end;
Hab mal schnell etwas gebastelt. Es geht zwar genauer, aber für grobe Berechnung reicht es.

Laut der Routine dauert es doppelt so lange bei 2147483647 Abfragen und nur einer Zuweiseung, als wenn der Wert 2147483647 Mal übergeben wird.
tja, das beispiel ist so gewählt, dass man sich die abfrage schenken kann, sie ist redundant. daher ist es nicht verwunderlich, dass der compi länger braucht, muss ja zwei mal den speicherzugriff machen.

aber normal ist es so, dass z.b. nicht nur 'ne seicherstelle gesetzt wird, mit der der processor prima umgehen kann (integer), sondern etwas complexeres... z.b. byte, string, record, objekt... und da sind die kosten der zuweisung höher, als für den vergleich.

ausserdem, kann man in einer solchen abfrage auch noch zusätzliche funktionen durchführen, z.b. 'n modified flag setzen... und hier ist es dann wichtig, dass das nicht immer gesetzt wird, sondern nur, wenn sich wirklich etwas geändert hat.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:22 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