Delphi-PRAXiS

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!

Sebastian Nintemann 2. Jan 2003 23:30

@Daniel B: Aber du musst zugeben, 50% Unterschied wär schon was... :mrgreen:
Es gibt ja auch immernoch die Meldung
Code:
[Error] Unit1.pas(41): Missing operator or semicolon
Naja die kommt bei mir aber eher selten vor. In der Hilfe ist auch nichts davon zu finden. Thema: abgehakt :mrgreen:

Warum die Buttons allerdings so unterschiedlich schnell waren interessiert mich doch.

Gruß, Sebastian

Mirilin 2. Jan 2003 23:31

So rein vom Gefühl her, würde ich immer ein Strichpunkt machen.;
Ich habe es so gelernt.;
Und es sieht auch abgeschlossener aus, als sonst!;
Wenn wir in der Schule VB Programmieren müssen, läuft das Zeugs bei mir nicht, da ich immer einen Strichpunkt mache.;
Dies nur so nebenbei.;

nailor 2. Jan 2003 23:38

//Hast du ne Psychose vom Programmieren?;

Sebastian Nintemann 2. Jan 2003 23:40

Zitat:

Zitat von Mirilin
Wenn wir in der Schule VB Programmieren müssen, läuft das Zeugs bei mir nicht, da ich immer einen Strichpunkt mache.;

Nach langem programmieren kommts auch vor, dass ich im MSN oder sonstwo ein ; hinter jedem Satz mache...

Das es auch an der Auslastung hängt ist klar, aber wieso sollte bei zwei Buttons die Auslastung immer so schwanken, dass immer die gleichen Ergebnisse zustande kommen?

Gruß, Sebastian

sakura 2. Jan 2003 23:40

Also, ich habe es kurz mal sowhl durch D5 als auch D7 gejagt. Beide erzeugen, bei Standard-Compiler-Schalter für beide Methoden jeweils den exact gleichen Assembler-Code.

Von daher sollte es keinen Unterschied in der Ausfürhungsgeschwindigkeit geben.

Mirilin 2. Jan 2003 23:41

ShowMessage('Nein, warum?');

Brüggendiek 2. Jan 2003 23:42

HalloT

Zitat:

Zitat von Nailor
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!

Siehe dazu Punkt 2, Delphi optimiert. Offensichtlich hat der mit den 50% Unterschied die Optimierung ausgeschaltet, so daß die Leeranweisungen vorhanden sind und somit Zeit brauchen. Die anderen haben optimiert, Delphi hat (mit minimal höherem Compileraufwand :mrgreen: ) die Leeranweisung rausgeworfen, so daß die Unterschiede im Bereich der Meßtoleranzen lagen!

Gruß

Dietmar Brüggendiek

Sebastian Nintemann 2. Jan 2003 23:45

Hmm, dann haben sich die das wohl ausgedacht um sich zu profilieren :wink:
Frag mich wie die dann drauf kommen...
Es passiert übrigens auch, dass ich, wenn ich mal mit Notepad html schreibe, verzweifelt versuche F9 zu drücken.

Gruß, Sebastian

nailor 2. Jan 2003 23:46

Ei, weil wenn der Assemblercode gleich ist, sie wohl auch das gleiche machen werden. Ob mit oder ohne ";" im Quelltext;
randomize;
windows.sleep(random(10000));

nailor 2. Jan 2003 23:47

War mal wieder zu lahm. Ich komm nur immer mit F5 und F9 durcheinander.

Und damit, dass MatLab kein begin braucht, aber immer ein end...

Sebastian Nintemann 2. Jan 2003 23:51

Zitat:

Zitat von Brüggendiek
Offensichtlich hat der mit den 50% Unterschied die Optimierung ausgeschaltet

Delphi-Quellcode:
//Sebastian
:mrgreen:

Nö, hab Standard-Kompilerschaltereinstellungen, der Code mit bzw ohne dem ; wurde ja auch garnicht kompiliert. Es war also der genau gleiche Code (hab sogar bei beiden dann ein ; hingesetzt, obwohl es, wie gesagt, nicht kompiliert wurde), nur war er bei dem einen Button schneller als beim anderen.

Gruß, Sebastian

Luckie 3. Jan 2003 02:32

@sakura: Ich dachte schon, du siehst den Thread nie. Endlich wird da mal inhaltlich wertvolles zum Problem gesagt. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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