Frage: StringList ohne SysUtils/Classes Units möglich?

Für Fragen von Einsteigern und Programmieranfängern...
alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von alfware17 »

Hallo, mein "Problem" steht ja schon im Betreff - ich habe ein Programm, welches systemübergreifend in Linux und Windows, 16-64bit läuft. Bisher hatte ich für die 32bit-Version keine Unit SysUtils mit drin, einfach weil dies meine EXE erheblich vergrößert hätte. Damit Ihr mal einen Eindruck von meinem "Leiden" habt, die 32bit EXE ist derzeit etwa 120KB groß, die 16bit EXE (Turbo Pascal) 84KB und die 64bit EXE 210KB. In den "sauren Apfel" war ich bereit zu beißen.

Nun habe ich eine neue Idee umgesetzt und meinen bisher 4 Abarbeitungsvarianten eine 5. hinzugefügt, welche ziemlich elegant mit StringList auch mein Problem löst, das hat aber technische Grenzen (Menge und Laufzeit), 3 der anderen 4 Varianten arbeiten daher mit einem Teile-und-Herrsche Algorithmus bzw mit verschiedenen. Na gut, ich habe von vornherein gewußt, es wird weder schneller noch robuster für mich, ich habe es trotzdem gemacht. Ich habe es so gelöst, daß das Programm den 5.Algorithmus nur in einem bestimmten Mengenbereich versucht und dies zwar sogar auch standardmäßig, man es aber per switch abschalten kann.

Ich stellte fest, ich brauche die SysUtils. Oder? Frage 1, ginge es auch ohne? In Punkto Datei-Arbeit habe ich das wie gesagt bei 32bit anders gelöst, ohne SysUtils. Nun wäre es doof, wenn sie wegen der StringList doch wieder rein müßte. OK. Algorithmus 5 also nur noch bei 64bit, auch damit kann ich leben, da meine eigenen 4 schneller sind und wenn ich es eh schon vor 15-25 Jahren programmiert habe, ist es nun auch egal, daß da noch ein paar Proceduren drin sind, die das Problem eigentlich in 100 Zeilen lösen, das sieht/merkt an der EXE ja keiner.

ABER: Nun stelle ich fest, eine weitere Unit muß rein, Classes. Hm. Und die "bläht" die EXE nun mal so richtig auf, die 64bix EXE ist nun 362KB groß, wenn ich es nicht per Compiler-Switch auf die 210KB begrenze und auf Algorithmus 5 verzichte. Gibt es einen anderen Weg, wo ich meine StringList herbekomme? Ich mache nicht viel damit, nur Load und Save, für Sort habe ich etwas eigenes (von Arrays angepaßt), da der Standard a) mir zu lahm und b) noch ein Sortierreihenfolge/Zeichensatz-Problem hat, welches ich aber mit einem eigenen Compare lösen könnte bzw schon habe. a) zu lahm jedoch nicht. Das Load und Save sind aber (in den Mengenbereichen, wo ich es zulasse, so bis 5 Millionen Zeilen) ordentlich schnell, deswegen hatte ich es ja versucht.

Kriege ich die EXE kleiner? Es ist für mich ein echtes psychologisches Problem, auch 2 64bit-Varianten finde ich doof, weil ich drüber nachdenken müßte, was ich wie benenne.
Danke für euren Rat

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von theo »

alfware17 hat geschrieben:
Mi 5. Apr 2023, 18:34
Es ist für mich ein echtes psychologisches Problem,
Das glaube ich auch! :lol:
Warum sind 362KB für dich ein Problem?
Hast du besondere Anforderungen?

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von MmVisual »

Mein Tipp: Lagere die String Listen Funktion in eine DLL aus, damit wird die EXE entsprechend kleiner.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von af0815 »

Was hindert dich, das Load und Save nicht auch selbst zu schreiben, wenn der Rest sowieso auf eigenen Routinen läuft.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von alfware17 »

Also zunächst mal danke für eure Anteilnahme...
Das Ärgerliche bezüglich der EXE-Größe ist, daß das Programm (fast) niemals größer war - zumindestens in der 32bit-Version immer so um die 100KB und daß ich nicht weiß, was und warum ich mir das alles an Ballast hereinhole. Ja ich weiß, Computer sind mächtig und groß, trotzdem ist es für mich ein Unterschied, ob so ein Programm 120KB hat oder plötzlich 363KB haben soll. Ich weiß auch, bei den Online-Programmen von Lazarus sind ganz andere Größen, viele MB. Aber das ist nunmal (Free)Pascal, und es sind keine großen Datenstrukturen drin, ich baue alles dynamisch auf. Also warum muß man sich wegen einer Platten/Datei-Funktion und wegen StringList fast eine Verdreifachung rein holen...

Das Load/Save habe ich ja selbst auch gemacht, wenn ich ohne StringList arbeite. Nur scheinen das Readln und das Writeln der echte Flaschenhals zu sein. BlockRead und BlockWrite habe ich probiert - mein Problem ist dann aber, daß ich die Informationen doch zeilenweise brauche und dann erst noch wieder umschaufeln müßte in meine verkettete Liste (ja alte Schule, nicht meckern). Ich wollte mal sehen, ob das StringList Load/Save tatsächlich um Größenordnungen schneller wäre - mit den beschriebenen Einschränkungen ja.

EIne DLL - hm, was würde das bringen und wie mache ich das überhaupt? Kann ich da nur Teile der SysUtils/Classes laden? Würde das bei 32bit auch gehen? Mein Programm läuft sehr viel auf der Kommandozeile und in Scripten. Ich dachte nur, es soll möglichst klein bleiben, daher war ich so "entsetzt" ob der Verdreifachung der EXE-Größe. Vergleichbare Programme habe ich nicht viele gesehen, nur eins das war aber soweit ich weiß in C geschrieben und war voller Datenstrukturen und Segmente und alles glaube ich knapp 280KB groß als EXE. Noch zu meinen Quellen, das sind so knapp 100KB in 3 Files

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von six1 »

Also wenn es dir nur um die Optik geht: UPX
Gruß, Michael

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von theo »

Aber wieso ist das ein Problem für dich? Hast du einen Computer von 1989?
Habe eben mal nachgeschaut. Meine Lazarus "Exe" auf Linux ist 170MB gross.
Das macht mir aber nichts aus.
Wieso auch? Davon passen immer noch 3000 Stück auf meine SSD.. :wink:

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von MmVisual »

Wenn jemand ein Virus schreibt und der so kein wie möglich sein soll damit man den gut verstecken kann, ja dann ist jedes KB wichtig.
EleLa - Elektronik Lagerverwaltung - www.elela.de

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von PascalDragon »

alfware17 hat geschrieben:
Mi 5. Apr 2023, 18:34
Gibt es einen anderen Weg, wo ich meine StringList herbekomme? Ich mache nicht viel damit, nur Load und Save, für Sort habe ich etwas eigenes (von Arrays angepaßt), da der Standard a) mir zu lahm und b) noch ein Sortierreihenfolge/Zeichensatz-Problem hat, welches ich aber mit einem eigenen Compare lösen könnte bzw schon habe. a) zu lahm jedoch nicht. Das Load und Save sind aber (in den Mengenbereichen, wo ich es zulasse, so bis 5 Millionen Zeilen) ordentlich schnell, deswegen hatte ich es ja versucht.
Selber schreiben. Wenn du solche Anforderungen hast, dann hilft nur das. Und letztlich ist auch TStringList nur Pascal Code, das heißt du kannst das ohne Probleme selbst implementieren.
FPC Compiler Entwickler

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von alfware17 »

PascalDragon hat geschrieben:
Mi 5. Apr 2023, 21:37
alfware17 hat geschrieben:
Mi 5. Apr 2023, 18:34
Gibt es einen anderen Weg, wo ich meine StringList herbekomme? Ich mache nicht viel damit, nur Load und Save, für Sort habe ich etwas eigenes (von Arrays angepaßt), da der Standard a) mir zu lahm und b) noch ein Sortierreihenfolge/Zeichensatz-Problem hat, welches ich aber mit einem eigenen Compare lösen könnte bzw schon habe. a) zu lahm jedoch nicht. Das Load und Save sind aber (in den Mengenbereichen, wo ich es zulasse, so bis 5 Millionen Zeilen) ordentlich schnell, deswegen hatte ich es ja versucht.
Selber schreiben. Wenn du solche Anforderungen hast, dann hilft nur das. Und letztlich ist auch TStringList nur Pascal Code, das heißt du kannst das ohne Probleme selbst implementieren.
Ich kann es nicht selbst... Wenn dann endet das wahrscheinlich so wie meine einfach-verkettete Liste (na gut ich könnte sie auch doppelt verketten obwohl ich das hier nicht brauche, da ich aber aus einem anderen Projekt und als Python-Fan vor Jahren auch mal ein DICT in Pascal nachempfunden habe, muß ich nicht bei ganz Null anfangen).

Kann ich die Typdeklaration und die Methoden von TStringList eventuell sehen, im Quellcode meine ich? Wahrscheinlich ja, wenn der ganze Lazarus quelloffen ist und sich selbst compilieren kann. Aber wo suche ich?

Und naja, ich habe beschlossen, das ganze organisatorisch zu lösen. Da der neue Algorithmus 5 mit den StringLists vor allem im Linux (keine Ahnung warum in Windows nicht) durchaus auch bis 20 Mio Zeilen "die Nase vorn" hat, gebe ich ihm mal eine Chance. In Linux/64 bleibt es bei der großen binary (immerhin 1 MB), Windows/64 bekommt 2 EXE, eine "normale" große mit 363KB, wo Algorithmus 5 drin spuken darf und sogar in manchen Fällen Standard ist aber viel früher (5 Mio Zeilen) selbst abschaltet und eine neue, kleinere mit 210KB, wo das mit den StringListen gar nicht drin ist. Meine Compile-Scripts machen dann eben einen neuen Namen der EXE. Und 16/32bit sind nicht betroffen.

Kann man eventuell auch die SysUtils im Quellcode sehen? Ich meine ja nur, weil ich da auch noch so eine Baustelle mit dem TSearchRec habe, die in 32/64bit anders läuft - ja ich weiß, ich stelle mich manchmal an... Wenn ich die Units sehen und teilweise übernehmen könnte, würden die EXE doch automatisch kleiner oder? Irgendwie habe ich in Erinnerung, daß der Linker dann eh nur die Funktionen mitnimmt, die auch gebraucht werden, oder sehe ich das falsch. Irgendworan muß es doch liegen, daß ein einfaches Uses Classes die EXE fast verdoppelt in der Größe.

Noch eine Frage. Wo finde ich ein einfaches Beispiel für die Sache mit der DLL? Was kann ich da alles auslagern? Wenn ich mich recht erinnere, zB bei 7Zip, wenn die DLL da ist, ist mehr Funktionalität da, wenn sie fehlt, meckert die EXE aber auch nicht sondern macht nur weniger. Wie macht man sowas?

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von MmVisual »

Die DLL musst du schon selbst schreiben (mit Lazarus), die Funktionen von der TStringList rein packen und entsprechend als Interface bereit stellen.
Wie das genau geht, dazu gibt es einige Anleitungen im Netz.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von af0815 »

alfware17 hat geschrieben:
Do 6. Apr 2023, 13:34
Kann ich die Typdeklaration und die Methoden von TStringList eventuell sehen, im Quellcode meine ich? Wahrscheinlich ja, wenn der ganze Lazarus quelloffen ist und sich selbst compilieren kann. Aber wo suche ich?
Im Quelltext, wo du einer variablen den Typ TStringlist zuordnest. Dort einfach die rechte Maustaste betätigen und der erste Punkt oben sollte "Find declaration of TSTringList" sein. Damit findest du die deklaration. Damit wirst du aber nicht ganz glücklich sein, tiefer geht es , wenn du dann immer den Parent verwendest und somit tiefer in das Objekt einsteigst. Es geht aber auch das du gleich in das Loadxx einsteigst, ebenso mit rechter Maustaste die Deklaration laden. Also alles keine Hexerei.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von wp_xyz »

alfware17 hat geschrieben:
Do 6. Apr 2023, 13:34
5 Mio Zeilen
Sorry wenn das jetzt etwas sarkastisch klingt: Du willst also eine Datei mit 5 Millionen Zeilen in deinem Programm bearbeiten und die ganze Datei im Speicher vorhalten (denn sonst würdest du keine StringList verwenden), und machst dir Sorgen, warum das Programm um 100 KB größer ist? Verstehe ich nicht...

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von theo »

wp_xyz hat geschrieben:
Do 6. Apr 2023, 16:32
Sorry wenn das jetzt etwas sarkastisch klingt: Du willst also eine Datei mit 5 Millionen Zeilen in deinem Programm bearbeiten und die ganze Datei im Speicher vorhalten (denn sonst würdest du keine StringList verwenden), und machst dir Sorgen, warum das Programm um 100 KB größer ist? Verstehe ich nicht...
Der TE hat ja selbst gesagt: "Es ist für mich ein echtes psychologisches Problem".
Ich glaube, hier geht es weniger um technische Fragen.
Falsches Forum? :wink:

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Frage: StringList ohne SysUtils/Classes Units möglich?

Beitrag von alfware17 »

MmVisual hat geschrieben:
Do 6. Apr 2023, 13:55
Die DLL musst du schon selbst schreiben (mit Lazarus), die Funktionen von der TStringList rein packen und entsprechend als Interface bereit stellen.
Wie das genau geht, dazu gibt es einige Anleitungen im Netz.
EIn toller letzter Satz. Ich wollte mit einem kleinen Programm und einer kleinen DLL beginnen um zu sehen, was man da machen muß damit es auf Bedarf nachgeladen wird. Daher meine Bitte um ein Beispiel.

Antworten