Sinus gähnend langsam unter Linux

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 7366
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Sinus gähnend langsam unter Linux

Beitrag von Mathias »

Ich habe folgendes Testprogramm gemacht, dabei habe ich festgestellt, das sin unter linux fast den Faktor 10 langsamer läuft als unter Windows(wine)
Verwendet man das sin von libm, läuft es auf beiden OS gleich schnell.
Wen es mit wine langsamer wäre würde ich es noch begreifen.

Code: Alles auswählen

program project1;

uses
  SysUtils;

var
  StartTime, FPCTime, CTime: TDateTime;
  r: Double;
  i, y: Int64;

  const
  {$IFDEF MSWINDOWS}
  clib_math = 'msvcrt.dll';
  {$ELSE}
  clib_math = 'm';
  {$ENDIF}

function c_sin(x: Double): Double; cdecl; external clib_math name 'sin';

begin
  WriteLn('Start FPC Sin...');
  StartTime := Now;

  r := 1.0;
  for y := 0 to 1000 do    begin
  Write('.');
  for i := 0 to 1000000 do  begin
      r := cos(r * i);
    end;
  end;
  WriteLn('Ergebnis als Test r: ', r:4:2);
  FPCTime:=Now - StartTime;

  WriteLn('Start libm Sin...');
  StartTime := Now;

  r := 1.0;
  for y := 0 to 1000 do    begin
  Write('.');
  for i := 0 to 1000000 do  begin
      r := c_sin(r * i);
    end;
  end;
  CTime:=Now - StartTime;
  WriteLn('Ergebnis als Test r: ', r:4:2);
  WriteLn(#10#10);
  Writeln('Plattform: ', {$I %FPCTARGETOS%});
  WriteLn('Zeit FPC:  ', FormatDateTime('ss.zzz', FPCTime), 's');
  WriteLn('Zeit libm: ', FormatDateTime('ss.zzz', CTime), 's');
end.
Die Auswertungen, man beachte das 18s bei Linux.

Code: Alles auswählen

Plattform: Linux
Zeit FPC:  18.431s
Zeit libm: 02.431s

Plattform: Win64
Zeit FPC:  02.035s
Zeit libm: 02.062s
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

wp_xyz
Beiträge: 5507
Registriert: Fr 8. Apr 2011, 09:01

Re: Sinus gähnend langsam unter Linux

Beitrag von wp_xyz »

Warum hast du denn ein "Write()" in der Zeitmess-Schleife, wenn du am sin interessiert bist?

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

Re: Sinus gähnend langsam unter Linux

Beitrag von Mathias »

wp_xyz hat geschrieben: Fr 9. Okt 2026, 18:42 Warum hast du denn ein "Write()" in der Zeitmess-Schleife, wenn du am sin interessiert bist?
Nach jedem 1mio Sinus ein Write das tut sicher nicht weh. Und wen es weh täte, würde es die anderen 3 Messungen auch ausbremsen.
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7456
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: Sinus gähnend langsam unter Linux

Beitrag von af0815 »

... wer sinnerfassend lesen kann ist im Vorteil ...

gelöscht deswegen

Edit:
Ist die Funktion sincos aus der Unit math schneller ? Und einmal verwendest du cos und einmal sin oben im Code. Abhängig von der CPU kann das dann über fsincos direkt auf der CPU laufen. (ist auch in der Unit math so)

https://tizee.github.io/x86_ref_book_we ... incos.html

bei der normalen sin und cos verschwindet das im fpc dschungel (function Sin(d : ValReal) : ValReal;[internproc:fpc_in_sin_real]; ) und ist somit für mich nicht nachvollziehbar.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten