Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Semikolon oder nicht (https://www.delphipraxis.net/2014-semikolon-oder-nicht.html)

Sebastian Nintemann 2. Jan 2003 22:58


Semikolon oder nicht
 
Hallo zusammen!
Vor längerer Zeit hab ich in nem Buch (Doberanz/Kowalski: Borland Delphi 5 - Grundlagen und Profiwissen) gelesen, man solle doch wo es nicht nötig ist das Semikolon nach einem Befehl weglassen, also wenn ein end auf den Befehl folgt. Der Grund: Das Semikolon verursacht, sofern keine Anweisung mehr folgt, eine sinnlose Leeranweisung. Ich hab mir daraufhin angewöhnt wo es nur geht den Strichpunkt wegzulassen, geht auch ganz automatisch bei mir inzwischen. Ich sehe das aber sonst bei (fast) keinem, und sogar in den Borland Demos wird nicht darauf geachtet. Also hab ich mich mal gefragt ob denn was dran ist, und folgendes probiert:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  start,i: integer;
begin
  start := GetTickCount;
  for i := 0 to 100000000 do
    begin
      begin
      end;
    end;
  Caption := IntToStr(GetTickCount-start)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  start,i: integer;
begin
  start := GetTickCount;
  for i := 0 to 100000000 do
    begin
      begin
      end
    end;
  Caption := IntToStr(GetTickCount-start)
end;
Zwei bis auf ein Semikolon völlig gleiche (gleich sinnlose) procedures, doch das Ergebnis ist eindeutig: Die erste Procedure braucht 50% mehr Zeit als die zweite! Die erste: ca 300ms, die zweite: ca 200ms. Das Verhältnis bleibt beim Verändern der Zahl.
Zugegeben, sowas braucht einen nicht zu interessieren bei "normalen" Berechnungen, ist aber trotzdem interessant, dass sogar die Borland Demos keine Rücksicht drauf nehmen. :roll:

Gruß, Sebastian

nailor 2. Jan 2003 23:04

Ich hab D6 Personal und es sie sind bis auf 2 ms gleich schnell. Mal ist die eine schneller, mal die andere. Scheint also das gleiche zu machen!

:cry: 205 - 207 ms. Das ist ein echter Benchmark :wink:

Sebastian Nintemann 2. Jan 2003 23:08

Hmm, ich hab auch D6 und immer das gleiche Ergebnis... die Zahlen schwanken nur um höchstens 10ms. Noch jemand mit anderen Ergebnissen?

Gruß, Sebastian

nailor 2. Jan 2003 23:10

Aber so blöde sind doch noch nicht mal die von Borland :wink:
So ein Bug (oder etwa gewollt) kann man doch nicht bewusst drinlassen!

Sebastian Nintemann 2. Jan 2003 23:19

Ach verdammt, das wird ja so auch garnicht compiliert. :oops:
Trotzdem interessant, der zweite Button braucht bei exakt dem selben Code weniger Zeit :?: und das immer wieder :?:

Gruß, Sebastian

nailor 2. Jan 2003 23:21

Bei mir braucht keiner mehr oder weniger Zeit.
Durchnitt: 206 ms.
Toleranz +- 1ms.

Daniel B 2. Jan 2003 23:23

Re: Semikolon oder nicht
 
Auch Moin, ;)

Zitat:

Zitat von Grotesquery
Vor längerer Zeit hab ich in nem Buch (Doberanz/Kowalski: Borland Delphi 5 - Grundlagen und Profiwissen) gelesen, man solle doch wo es nicht nötig ist das Semikolon nach einem Befehl weglassen, also wenn ein end auf den Befehl folgt.

Das finde ich so schlimm andiesen Büchern. Später sieht man in Foren(allgemein), das Leute mit Prozeduren aus solchen Büchern kommen, irgend eine Zeile dazu geschrieben haben und jetzt nicht wissen warum es sich nciht mehr komplizieren lässt. Weil sie es einfach nicht lernen, das bei >= 2 Zeilen, alle davor ein ; haben müssen.

Zur "Fehlerquelle", ich hab lieber ein paar "nop's mehr im ASM COde, als später ärger beim schreiben. Und die paar ms machen es wirklich nicht aus. Vielleicht wenn man grosse! Spiele programmiert, wo es auf sowas ankommt, aber das würde dann sowieos in Cpp o.ä. passieren, da siehts eh wieder anders aus.

Mein Vorschlag, immer reinschreiben. Und wenn es nur ein Exit ist.

Grüsse, Daniel :hi:

nailor 2. Jan 2003 23:24

PS: Kommt auch auf die Rechnerauslastung an. Wenn du gleichzeitig noch UT2003 spielst brauchst du länger...

Brüggendiek 2. Jan 2003 23:25

Hallo!

1. Das überflüssige ';' erzeugt eine Leeranweisung.
2. Delphi optimiert normalerweise (Compilerschalter $O+) den Code (daher die Benchmark-Unterschiede???).
3. Kein ';' vor END und eine eingefügte Anweisung: Nachtragen oder Compiler meckert!

Also schreibe ich das ';' grundsätzlich. Die Methode stammt aber wohl noch von den Lochkarten, weil da Änderungen schwer waren (welche Spalte haben wir denn??)!

Gruß

Dietmar Brüggendiek

nailor 2. Jan 2003 23:29

Wenn das ";" eine Leeranweisung ausführen würde, würde das bedeuten, das 100000000 Leeranweisungen keine Rechnezeit verbrauchen. Kann nicht sein. Daraus schließe ich, dass ein ";" keine Leeranweisung verursacht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 Uhr.
Seite 1 von 3  1 23      

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