![]() |
AW: Laufzeitoptimierung eines Consolen-Programms
Zitat:
|
AW: Laufzeitoptimierung eines Consolen-Programms
Liste der Anhänge anzeigen (Anzahl: 1)
MPInt = 4.7 Sekunden auf einem kleinen Schlepptop mit Delphi 11.3 in 64 Bit.
Code:
##### StrMath ####################
c056376183596999899117308588625209953108464105926767074623063990238734463292307 ad=84031 su=25065 in 9.61070060*1000 sec ##### Int256 #################### c0-5735511060232939254446901397460932042972491126387202754970036519831719797026 ad=3973389 su=5290133 in 7.98520350*10 sec ##### MPInt #################### c057505664344760038530679973515630121094664952824482015253584348948195539615650 ad=83884813 su=25000001 in 4.84421430 sec Also dafür, dass ich beim StrMath das AND und SHR durch zwei eine brutal schlimme Division ersetzen mußte (DIV/MOD aus ganz ganz ganz vielen ADD/SUB) und nicht nur billig einmal ADD/SUB/SHR/AND je Durchgang nutzen konnte, ist es doch fast erstaunlich, dass es damit bloß 9000 Sekunden dauert (knapp 6 Tage). Schade irgendwie. Mein MatheString konnte früher mal mit bis 2.14 Milliarden Dezimalstellen rechnen ... jetzt sind es nur noch 1.07 Milliarden (außer man entfernt das böse Unicode) Ich dachte es wollte AUCH jemand mal die Quellcodes veröffentlichen, nachdem es aufgeräumt wurde, oder so. ![]() Das sieht immernoch nur nach Part I aus. Bei mir hab ich nur bei den alten 5.1c und 5.2 den Part II. und dort leider nur mit den vorkompilierten DCUs für Delphi 5 bis 7 plus deren PAS-Header als Doku (ohne die Implementation). |
AW: Laufzeitoptimierung eines Consolen-Programms
Liste der Anhänge anzeigen (Anzahl: 1)
DEC Math in aktuellerem Delphi. (es gibt vom DEC Part II bisher ja leider nur die DCU für Delphi 5, 6 und 7 und dazu den Interface-Teil der PAS, als Doku)
DEC Part III .... weiß nur, dass es das geben dürfte, aber was es ist ... keine Ahnung. DEC Part I kennen ja alle ... das mit den Verschlüsselungen. (inzwischen auch als DEC Lite im GetIt, bzw. voll im GitHub) Lite, weil es verboten ist gewisse Verschlüsselungstechnologien aus den USA zu exportieren, auch wenn das GetIt-Packet eigentlich aus Deutschland kommt. Mal wieder ein Delphi 7 installiert und als erstes versucht, ob sich aus den DCU ein paar OBJ zu erzeugen lassen, welche sich dann in neueren Delphis linken ließen. Leider klappt das nur aus PAS (sowie auch aus C). OK, dann leider nun der Weg über eine DLL. Mir war so, als hätte Hagen den Quellcode an jemand weitergegeben, welcher das noch bissl aufräumen wollte, weil "so wie es ist" wollte es Hagen nie rausgeben. siehe ![]() usw. |
AW: Laufzeitoptimierung eines Consolen-Programms
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
* 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:
Komisch, hätte gedacht, dass das SHR/AND ... ähhh, ich meinte der DIV/MOD-Ersatz, das Tempo enorm runterzieht,
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; aber ein halbwegs equivalentes DezimalShift senkt die Zeit in meinem StringMath von 9610 auf nur 3355 Sekunden. :shock: |
AW: Laufzeitoptimierung eines Consolen-Programms
Zitat:
Von DEC kenne ich nur PDP 11. :P |
AW: Laufzeitoptimierung eines Consolen-Programms
So eine Besserwisserei...:roll:. Auch wenn es nicht jeder kennt, muss man nicht alles kommentieren und verbessern.
Zitat:
|
AW: Laufzeitoptimierung eines Consolen-Programms
Zitat:
|
AW: Laufzeitoptimierung eines Consolen-Programms
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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