Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Laufzeitoptimierung eines Consolen-Programms

  Alt 10. Sep 2023, 13:01
Zitat:
c0= 57 50566 43447 60038 53067 99735 15630 12109 46649 52824 48201 52535 84348 94819 55396 15650
ad=83884813 su=25000001 in 11.24300002 sec

Programmende mit ENTER
* OK, in einem Delphi 7
* mit Codes, die für eine 17 Jahre alte CPU optimiert wurden
* auf einem, 12th Gen Intel Core i7-1260P 2.10 GHz
* und außerdem wurde es nicht direkt für so "einfache" Berechnungen ausgelegt, sondern auf Cryptography und hochkompliziertes Zeugs, wie 'ne Million Stellen von Pi zu berechnen

Delphi-Quellcode:
program DECMathTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  {ASN1, Console, ConsoleForm, CPU, CRC,
  DECCipher, DECData, DECFmt, DECHash, DECRandom, DECUtil,
  IDPrimes, IsPrimeHRUnit, LHSZ, NCombi, NGFPBld, NGFPs, NGFPTab,
  NIntM,}
 NInts {NInt_1, NMath, NPolys, NRats, Prime};

{$R *.res}

var
  a, b, c, soll, z, sub: IInteger;
  start: TDateTime;
  duration: Double;
  nad, nsu: Int64;
  nn: Integer;

begin
  NSet(a, '170141183460469231731687303715884105757');
  NSet(b, '170141183460469231731687303715884105703');
  NSet(soll, '57896044618658097711785492504343953926634992332820282019728792003956564819968');
  NSet(z, '340282366920938463463374607431768211455');
  NSet(sub, '11111111111111111111111111111111111111111111111111111111111111111111111111111');

  nad := 0;
  nsu := 0;
  start := Now;
  for nn := 0 to 25000000 do begin
    NMul(c, a, b);
    while NCmp(c, soll) < 0 do begin
      NAdd(c, c, sub);
      Inc(nad);
    end;
    while NCmp(c, soll) > 0 do begin
      NSub(c, c, sub);
      Inc(nsu);
    end;
    NShr(a, c, 128);
    NAnd(b, c, z);
  end;
  duration := (Now - start) * SecsPerDay;

  WriteLn('c0=', NStr(c));
  WriteLn('ad=', nad, ' su=', nsu, ' in ', duration:1:8, ' sec');
  WriteLn;
  WriteLn('Programmende mit ENTER');
  ReadLn;
end.

Delphi-Quellcode:
  for var nn := 25000000 downto 0 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 d; //a := c shr 128;
    //b := c mod d; //b := c and z;
    //MatheString.MatheObj.QuotientModulo(c, d, PString(@a)^, PString(@b)^);
    var i := Length(c) - 38;
    a := Copy(c, 1, i);
    b := Copy(c, i + 1);
  end;
Komisch, hätte gedacht, dass das SHR/AND ... ähhh, ich meinte der DIV/MOD-Ersatz, das Tempo enorm runterzieht,
aber ein halbwegs equivalentes DezimalShift senkt die Zeit in meinem StringMath von 9610 auf nur 3355 Sekunden.
Angehängte Dateien
Dateityp: 7z DECMathTest.exe.7z (60,7 KB, 3x aufgerufen)
$2B or not $2B

Geändert von himitsu (11. Sep 2023 um 11:09 Uhr)
  Mit Zitat antworten Zitat