Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#27

AW: Laufzeitoptimierung eines Consolen-Programms

  Alt 3. Sep 2023, 04:17
Hier geht es auch ausschließlich um + , - , shr , and und Größer-/Kleinervergleiche, also um das Einfachste, was geht und wo man praktisch algorithmisch nichts optimieren kann.

Leider kann meine Lib kein binäres AND und SHR, bzw. nicht direkt, da sie durchweg dezimal arbeitet, hat sie Probleme mit 2er-Potenzen, die in ein 10er System nicht rein passen.
Es wäre alles besser, hätten wir 4 Finger, inkl. Daumen.

SHR kann ich ja noch durch eine extrem unoptimale Division ersetzen, aber beim AND müsste ich dann auch in jedem Durchlauf das dreifach umrechnen.

Delphi-Quellcode:
uses
  System.SysUtils, Winapi.Windows, System.Diagnostics,
  StringMatheLib in 'stringmathelib_131\StringMatheLib.pas',
  StringMatheRec in 'stringmathelib_131\StringMatheRec.pas';

begin
  try
    {const}var ten: MatheString := 10;
    {const}var two: MatheString := 2;

    var soll := Power(two, 255);
    var z := Power(two, 128) - 1;
    var sub := Power(ten, 77) div 9;

    var a := Power(two, 127) + 29;
    var b := Power(two, 127) - 25;
    var c := MatheString(0);

    var nad := 64;
    var nsu := 64;

    var watch := TStopwatch.StartNew;

    for var nn := 0 to 25000000 do begin
      c := a * b;
      while c < soll do begin
        c := c + sub;
        Inc(nad);
      end;
      while c > soll do begin
        c := c - sub;
        Inc(nsu);
      end;
      a := c div '340282366920938463463374607431768211456'; //a := c shr 128;
      b := c and z;
    end;
    var duration := watch.Elapsed.TotalSeconds;
    WriteLn('c0', string(c));
    WriteLn('ad=', nad, ' su=', nsu, ' in ', duration:1:8, ' sec');
  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.
$2B or not $2B

Geändert von himitsu ( 3. Sep 2023 um 04:31 Uhr)
  Mit Zitat antworten Zitat