[gelöst] Lazarus versus Delphi

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 580
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.9 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von Niesi »

Mathias hat geschrieben: Sa 25. Jan 2025, 08:56
...

Wurde da nicht mit der MSE versucht dagegen zu steuren ?
Die MES muss angeblich extrem schnell sein.
Das ist sicher eine Überlegung wert für alle, denen es ganz speziell auf Geschwindigkeit ankommt. Und das Projekt wird anscheinend weiter gepflegt - ich hatt mal irgendwo aufgeschnappt, dass das nach dem Tod von Martin nicht der Fall wäre ...

https://wiki.freepascal.org/MSEide%2BMSEgui

https://github.com/mse-org/mseide-msegu ... /readme.md

https://github.com/mse-org/mseide-msegui
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus versus Delphi

Beitrag von theo »

Naja, MSE ist schon eher ein totes Pferd.
Die Rechnerei wird dadurch auch nicht schneller, allenfalls der Zugriff auf die Komponenten.

Ich bin mir sicher, Juelins Problem lässt sich mit Lazarus noch gut optimieren, aber mit dem geposteten Code kann ich nicht viel anfangen.
Man müsste mal Messpunkte setzen.
Am voraussetzungslosesten so:

Code: Alles auswählen

var Tick:QWord;
begin
  Tick:=GetTickCount64;
  TuWas;
  TuWas;
  TuWas;
  writeln('Messpunkt1: ',GetTickCount64-Tick,'ms');   // oder DebugLn(..) etc..
  
  Tick:=GetTickCount64;
  TuWasAnderes;
  writeln('Messpunkt2: ',GetTickCount64-Tick,'ms');     
end;    

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Lazarus versus Delphi

Beitrag von Mathias »

Naja, MSE ist schon eher ein totes Pferd.
Dies denke ich auch. Hat MSE alle Widget selbst gemacht, ohne von Verwendung von GTK und co.
Ich werde keine Zeit in MSE investieren, das setze ich auf moderneres wie GTK4.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von af0815 »

Martin hat bei MSE keine LCL mit schleppen müssen. Das war seine Entscheidung und darum hat er die MSE anders auf den fpc aufsetzen lassen können.

Außerdem hat er seine Entscheidungen mit niemanden abstimmen müssen. Das hat das Projekt aber nach seinem plötzlichen Tod mehr oder minder in die absolute Niesche befördert. Es ist zwar am Leben, aber der Schwung ist weg und es fristet halt ein Dasein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Lazarus versus Delphi

Beitrag von juelin »

So war ein paar Tage Krank.
Bin immer noch nicht ganz gesund.
Mir ist aber noch was aufgefallen.
Das Exe-File der Dephiversion hat 2,84 MB
Das Exe-File der Lazarusversion hat 45,8 MB.
Da wird es wohl irgendwie liegen.
Eigentlich sind beide Versionen gleich, Weil ich den Sourcecode von Delphi übernommen habe.
Inder Routine ONButton1Click (um die geht ja hier) habe ich nur minimale Änderungen vorgenommen.
z.B. Weil die ja so lange läuft, das man Sie mit OnButton3Click (Programm beenden) abbrechen kann.
Dazu habe ich die ehemals lokale Variable lla global gemacht und anein paar Stellen abgefragt ob die Variable <> 9 (Abbruch) ist.
Das dürfte aber nun wirklich nicchts ausmachen.
Damit das Beenden der Routine (neues Spiel) auch funktioniert musste ichen den Befehl
Application.HandleMessage;
einbauen. Sonst häte Button3.Click nie zeit bekommen.
So das sind alle Unterschiede zwischen der Delphi- und er Lazarus Version.
Habe auch mal beider Versionen mit dem CompareText verglichen.
Es gibt ausser den vom mir genannten keine Unterschiede.

Allerdings habe ich an anderer Stelle (hat nicht mit dem Laufzeitverhalten zu tun) schon größere Änderungen gemacht.
So habe ich alle TEDit Felder aus Delphi in TMaskEdit Felder umgewanndelt.
und die meisten TButton aus Delphi in TBGRASpeedButton umgewandelt.

Vielleicht hilft Euch diese Erklärung.
Gruß
Jürgen

Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Lazarus versus Delphi

Beitrag von juelin »

Hier nochmal für die die es interessiert beide Versionen.
Und nochmal, es gahr gar nicht darum zu verstehen was die Routinen machen,
sondern darum obwohl beide Routinen gleich sind so unterschiedlich lang laufen.
Gruß
Jürgen
Dateianhänge
sudoku-delphi.zip
(522.06 KiB) 51-mal heruntergeladen
sudoku-lazarus.zip
(660.58 KiB) 53-mal heruntergeladen

RudiRatlos
Beiträge: 26
Registriert: Sa 21. Sep 2019, 13:02
OS, Lazarus, FPC: Windows 11, lazarus 3.8, FPC: 3.2.2
CPU-Target: 64Bit
Wohnort: München

Re: Lazarus versus Delphi

Beitrag von RudiRatlos »

Hallo juelin,

mit meinem Halbwissen ist mir folgendes aufgefallen:

Es steht da z. B.

Code: Alles auswählen

procedure TForm1.Anzfeldleer;

begin
  if feldnum = 1 then
  begin
    MaskEdit1.SpaceChar:=' ';
    MaskEdit1.Refresh;
  end;
  if feldnum = 2 then
  begin
    MaskEdit2.SpaceChar:=' ';
    MaskEdit2.Refresh;
  end;
// usw. usw. bis 
  if feldnum = 81 then
  begin
    MaskEdit81.paceChar:=' ';
    MaskEdit81.Refresh;
  end;
kostet das nicht doch erheblich mehr Zeit als wenn man jeweils alles mit einem "else" verbindet, also

Code: Alles auswählen

procedure TForm1.Anzfeldleer;

begin
  if feldnum = 1 then
  begin
    MaskEdit1.SpaceChar:=' ';
    MaskEdit1.Refresh;
  end else
  if feldnum = 2 then
  begin
    MaskEdit2.SpaceChar:=' ';
    MaskEdit2.Refresh;
  end else
// usw. usw. bis 
  if feldnum = 81 then
  begin
    MaskEdit81.SpaceChar:=' ';
    MaskEdit81.Refresh;
  end;
end;
oder einfacher, nachdem man die MaskEdit# einem Array zugeordnet hat

Code: Alles auswählen



procedure TForm1.Anzfeldleer;

var i : integer;

begin

for i := 1 to 81 do
  if feldnum = i then
  begin
    MaskEdit[i].SpaceChar:=' ';
    MaskEdit[i].Refresh;
	break;
  end;
end;

"Anzfeldleer" wird häufig aufgerufen (257 mal)
und es gibt einige ähnliche "if loops" die von 1 bis 81 laufen:

TForm1.Anzfeld;
TForm1.Anzfeldleer;
TForm1.Farbhfeld;
TForm1.Farbsfeld; // Riesenschleife, da muss man aber vorher einiges einem Array zuordnen
TForm1.Feldaus;


Das alles sind Ideen um schneller zu werden. Ich kann kein Delphi 7 (mehr) mit Windows 11 starten, um das damit zu vergleichen.

Aber vielleicht sind die Ideen weiter oben weitaus effizienter.

Auf jeden Fall wünsche ich viel Erfolg
Rudi

paweld
Beiträge: 85
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Lazarus versus Delphi

Beitrag von paweld »

@juelin - wie @RudiRatios schrieb, ist Ihr Code furchtbar „langatmig“, die Wiederholung von zitierten Zuweisungen oder die Duplizierung von Ereignissen macht es sehr schwierig, den Code zu analysieren und zu ändern, da dies dann für jedes Ereignis einzeln geschehen muss.

Im Anhang finden Sie eine Version, bei der die doppelten Zuweisungen und Ereignisse entfernt wurden. Dadurch konnte der Code von ~29k Zeilen auf ~4k Zeilen reduziert werden
Dateianhänge
sudoku.zip
(21.97 KiB) 42-mal heruntergeladen
Grüße / Pozdrawiam
paweld

Antworten