AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Laufzeitoptimierung eines Consolen-Programms
Thema durchsuchen
Ansicht
Themen-Optionen

Laufzeitoptimierung eines Consolen-Programms

Ein Thema von stpolster · begonnen am 1. Sep 2023 · letzter Beitrag vom 11. Sep 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Laufzeitoptimierung eines Consolen-Programms

  Alt 3. Sep 2023, 03: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.
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 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