Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   StrToInt langsam in D 10.4 (https://www.delphipraxis.net/208209-strtoint-langsam-d-10-4-a.html)

BavDev 25. Jun 2021 10:31

Delphi-Version: 10.4 Sydney

StrToInt langsam in D 10.4
 
Hallo,

ich portiere gerade eine größere Anwendung von DXE5 nach D10.4.2. Dazwischen hatte ich keine anderen Versionen, bin also erst vor Kurzem auf die aktuelle Version umgestiegen.
In der Anwendung habe ich einen Import von 5000 Datensätzen, der mit DXE5 kompiliert 3 Sekunden dauert. Mit D10.4.2 dauert er 1:21 Minuten! Alles gleicher Code... Ich fand dann heraus, dass das am StrToInt liegt. Das wird in dem Fall pro Datensatz 4x aufgerufen. Ich habe dann nach Alternativen gegoogelt, ohne Erfolg. Schließlich fand ich heraus, dass ich (nur) mit StrToIntDef die gewohnte Performance erreiche.

Kann mir das hier jemand bestätigen:
- StrToInt ist ab irgendeiner Version nach XE5 (welcher?) extrem langsam.
- Das gleiche gilt für TryStrToInt, aber nicht für StrToIntDef.
- Und entgegen anderer Meldungen in diversen Foren hat die Umkehrfunktion IntToStr nicht dieses Problem.

Frage:
- Warum ist das so? Das ist doch alles die gleiche Funktion, nur mit unterschiedlicher Fehlerbehandlung.

Mich kostet es jetzt einigen Aufwand, in ca. 1,5 Mio Codezeilen alle Vorkommen von StrToInt umzubauen... Nicht das was ich als RAD Development verstehe...

jziersch 25. Jun 2021 11:10

AW: StrToInt langsam in D 10.4
 
Der Code von IntToStr und IntToStrDef ist praktisch gleich und sollte gleich schnell laufen, es sei denn, es kommt zu Exceptions. Evtl. kommt es zu Exceptions durch NULL Werte?

hoika 25. Jun 2021 11:47

AW: StrToInt langsam in D 10.4
 
Hall0,
jziersch: es geht um StrToInt, nicht um IntToStr.

Zitat:

Ich fand dann heraus, dass das am StrToInt liegt
Woher weißt Du das?
Bei einem Inport gibt es doch noch andere Einflüsse.

jziersch 25. Jun 2021 12:03

AW: StrToInt langsam in D 10.4
 
Hatte mich verschrieben, meinte StrToInt.
In beiden Fällen wird einfach Val() aufgerufen.

TiGü 25. Jun 2021 12:04

AW: StrToInt langsam in D 10.4
 
Gute Idee, bitte mal auf ausgeblendete EConvertError prüfen.

DXler 25. Jun 2021 15:54

AW: StrToInt langsam in D 10.4
 
Hallo zusammen.

Ich habe bis vor ein paar Monaten auch Zahlen, die in einer String-Variable stehen, mit "StrToInt" umgewandelt bis ich irgendwann mal auf die Idee kam einfach hinter dem Variablennamen (z. B. "test") mal einen "." zu setzen um zu gucken ob und vorallem was passiert...

Mir wurde daraufhin eine Liste mit etlichen Funktionen angezeigt. Unter anderem auch "ToString" und "ToInteger".

Seitdem spare ich mir "IntToStr" und "StrToInt" (Delphi 10.1) und setze einfach hinter den Variablennamen die entsprechende Funktion.


Ob das allen hier im Forum bekannt ist weiß ich nicht, aber vielleicht hilft es ja dem einen oder anderen weiter...


Welche Prozeduren oder Funktionen genau hinter den "To..."-Funktionen stecken weiß ich nicht und auch nicht ob sie einen optimierten Code erzeugen.

Blup 25. Jun 2021 16:28

AW: StrToInt langsam in D 10.4
 
Ich bezweifle das StrToInt so langsam sein kann, das der Import von 5000 Datensätzen plötzlich 78 Sekunden längert dauert.
Wie oft rufst du den StrToInt pro Datensatz auf?

Wenn StrToIntDef schneller geht, liegt das wahrscheinlich an deiner Exception-Behandlung im Import.
Die wird jedesmal aufgerufen, wenn StrToInt ein ungültiger Wert übergeben wird.

Ansonsten schreib ein kleines Testprogramm das wir mit unterschiedlichen Compilern übersetzen können.
Nichts aufwendiges, nur eine Schleife die IntToStr ein par Millionen mal aufruft und die Gesamtzeit ausgibt.

hoika 25. Jun 2021 18:51

AW: StrToInt langsam in D 10.4
 
Hallo,
ist der Import nur in der IDE so langsam,
oder auch, wenn du das Programm direkt startest.

Stevie 25. Jun 2021 19:20

AW: StrToInt langsam in D 10.4
 
Unmöglich - StrToInt zieht ca 10mio strings in 100ms durch auf nem 3.2GHz i7

BavDev 25. Jun 2021 20:57

AW: StrToInt langsam in D 10.4
 
Hallo an alle,

jawohl, ich konnte das ganz eindeutig feststellen. Mein Import liest eine CSV-Zeile, parst die in einzelne Strings und (in dem Fall) 4 davon sind integers und werden mit StrToInt umgewandelt. Ich habe den Import so abgekürzt, dass nur die Zeilen gelesen werden, geparst und StrToInted. Keine weitere Verarbeitung. Dabei festgestellt, dass die nachgelagerte Datenbank-Verarbeitung die Import-Laufzeit nur unwesentlich beeinflusst. Statt 3 Sekunden dann 3.4 Sekunden. Wenn ich die 4 StrToInts weglasse, dann habe ich die gewohnte Performance. Wenn ich die StrToInts durch StrToIntDef ersetze, dann auch. Nur mit 20000x StrToInt verlängert sich der genannte Import definitiv von 3 Sekunden auf 1:21 Minuten.
Mittlerweile habe ich noch was herausgefunden. Den Unterschied gibt es nur, wenn ich das Programm im Debug-Modus laufen habe! Ohne Debug -> StrToInt ist gewohnt schnell! Nun habe ich den Debugger aber immer laufen beim Programmieren...

Somit ändert sich meine Frage dahingehend:
Wieso ist das im Debug-Modus so? Zwar nicht mehr so wichtig, weil das Kunden-Endprodukt läuft ja so schnell wie gewohnt. Aber dennoch für mein Verständnis wichtig. (Und es irritiert mich zwischendurch, wenn ich das mit der alten Version von XE5 vergleiche.) Angeblich ist StrToIntDef ja der gleiche Code? Wieso ist der dann soviel schneller?
Exceptions spielen übrigens keine Rolle, soweit ich das von verschiedenen Imports mit verschiedenen Daten beurteilen kann. Manchmal steht einfach nichts im Feld, dann gibts Exception, wo ich je nach Kontext auf 0 oder -1 setze.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf