-
Speicherplatz verschwenden durch Variablendefinition?
Hallo,
wir überlegen gerade, ob die beiden unten angegebenen Programmcodes sich im Speicherverbrauch unterscheiden. Die Routinen machen genau das gleiche. Aber die 2. Routine speichert das Rückgabeergebnis vor der Rückgabe noch in eine eigene Ergebnisvariable um. Das heißt, die 2. Routine hat eine Variablendefinition mehr. Aber meiner Meinung nach muss auch die erste Routine den Speicher 100000 "verbraten", da der Return das Ergebnis ja in irgendeinem Speicherbereich aufbereiten muss.
Dieter
dcl-proc test1;
dcl-pi *n varchar(100000);
dcl-s var1 varchar(50000);
dcl-s var2 varchar(50000);
... jetzt die Variablen mit Werten füllen ...
return var1+var2;
end-proc;
dcl-proc test2;
dcl-pi *n varchar(100000);
dcl-s var1 varchar(50000);
dcl-s var2 varchar(50000);
dcl-s ergebnis varchar(100000);
... jetzt die Variablen mit Werten füllen ...
ergebnis = var1 + var2;
return ergebnis;
end-proc;
-
... wenn ihr aus den varchar char macht, spart ihr nochmal Speicherplatz, das ist zwar nicht viel, aber es läppert sich - und wenn man den gesparten Platz am Jahresende als Bonus ausgezahlt kriegt, kann da ein ganz schönes Sümmchen zusammenkommen.
D*B
-
Der Speicherplatz läppert sich bei uns tatsächlich, wenn man überlegt, wieviele Programme betroffen sind und wie oft diese von wie vielen Usern aufgerufen werden. Die Angaben oben sind ja auch nur ein Beispiel. Die Variablen könnten natürlich auch größer sein.
Ich persönlich finde die 2. Variante besser (lässt sich im Zweifel besser debuggen). Meine Frage geht ja nur dahin, ob dieses Verfahren den Speicherbedarf quasi verdoppelt?
Dieter
-
Wenn man aus den varchar char macht, funktionieren diese Routinen aber nicht mehr.
Die lächerlichen Ersparnisse werden von denen, die ihre SQL-Statements mit zig %TRIMs zusammenstellen, zigfach wieder verbraten, D*B. :-)
-
Ich gehe mal davon aus, dass Dieter Benders Vorschlag eher ironisch gemeint war.
-
Welchen Speicherplatz meinst du und wo siehst du wieviel belegt ist?
 Zitat von dschroeder
Der Speicherplatz läppert sich bei uns tatsächlich, wenn man überlegt, wieviele Programme betroffen sind und wie oft diese von wie vielen Usern aufgerufen werden.
-
Ich meine den Hauptspeicher. Unsere Anwendung verwendet sehr viele "kleine" Tools, die immer wieder aufgerufen werden. Unsere Überlegung geht dahin, dass man die Hauptspeicherbelastung möglicherweise stark erhöht, wenn man "große Variablen" (Zeichenketten oder Arrays) übermäßig groß deklariert. Deshalb die Frage, ob das Umspeichern nochmal zusätzlich Speicher kostet.
Sehen kann ich die Speicherbelegung leider nicht direkt.
Ich tendiere selber eher dazu, ein Programm lieber lesbar zu schreiben anstatt auf das letzte Bißchen Performance oder Speicher zu achten. Trotzdem muss man ja nicht jede Deklaration übertreiben. Ich denke, dass würde auch unserer AS/400 irgendwann wehtun.
Dieter
-
Nochmal zur Erklärung: Ich habe lange Jahre die Philosophie vertreten, dass Hauptspeicher auf der iSeries kein Problem darstellt, welches man als Programmierer beachten müsste. Aber vor ein paar Jahren hatten wir mal ein Problem in einer Copy-Strecke, die in fast jedem Programm vorhanden ist. Dort hatten wir große Datenstruktur-Deklarationen drin und vergesse, die Strukturen als Template zu deklarieren. Das heißt, jedes Programm, das die Copy-Strecke verwendet hat, hat den Speicherplatz für die Datenstrukturen der Copy-Strecke alloziiert. Das haben wir zunächst gar nicht gemerkt. Aber irgendwann mussten wir mal die gesamte Anwendung durchkompilieren. Danach drehte sich auf der Anlage fast nichts mehr, weil der Hauptspeicher völlig zu war. Nachdem wir die Struktur in der Copy-Strecke auf Template gesetzt haben und alles neu kompiliert hatten, lief es wieder wie geschmiert. Das heißt, auch bei einer iSeries muss man grundsätzlich auf den Speicherverbrauch achten.
Dieter
-
Ab 7.1 kann bei der Return-Definition einer Prozedur das Schlüsseltwort RTNPARM angegeben werden.
Dieser soll die Performance spezielle bei größeren Rückgabewerten erhöhen.
RTNPARM
lg Andreas
-
@varchar oder char: selbstredend geht das auch mit char. Das ist ein prototyped call, der nicht einmal exportiert wird, wo ist da das Problem (RTFM)
@Speicherverbrauch: in Deinem Beispiel geht es um lokale Variablen und die sind automatic storage, werden also zur Laufzeit allokiert und leben bis zum Ende der Prozedur. Physilaisch werden sie vom Heap des Prozesses geholt und da zählt nur die maximale Größe => Platz kostet das also nur bei denen. die zum Maximum beitragen (Rekursion, tief verschachtelte Procedures jeweils mit viele automatic storage) das kostet allenfalls Zeit zum allokieren und initialisieren des Speichers.
@Speicherverbrauch: Bei der Copy Strecke kommt es wieder drauf an, wo die drin steckt. Wenn die im globalen Teil des Moduls steckt und man gleichzeitig ein krummes Modul Design hat (z.B.: viele ein procedure Module) und auch noch mit den Activationgroups krause Dinge veranstaltet, dann kriegt man da vielleicht Probleme hin. Problemkandidaten sind auch statische Riesenarrays, die kosten Zeit und Platz, was noch schlechter ist.
Resumee: bei Beachtung einiger weniger einfacher Grundregeln im modularen Design ist Speicherplatz kein Faktor um den man sich besonders kümmern müsste. Vernünftig eingesetzt ist es besser der Büchse ein wenig mehr Speicher zu gönnen und ihn bei der Programmierung sinnig einzusetzen. Ansonsten gilt: wo kein Problem feststellbar ist (Laufzeit, Skalierbarkeit) versucht man auch nicht das nicht vorhandene Problem zu lösen.
D*B
-
Erstmal Danke für die vielen Antworten und Tipps. Meine konkrete Frage, ob die beiden Procedures unterschiedlich viel Hauptspeicher (temporär natürlich, eben solange die Routine läuft) benötigen, konnte scheinbar niemand beantworten. Ist wahrscheinlich auch gar nicht so einfach.
Ich entnehme dem ganzen aber, dass Speicher durch lokale Variablen kein besonderes Problem darstellen sollte, da er ja immer nur kurz gebraucht und dann wieder freigegeben wird. Also brauchen wir da nicht zu knausern.
Dieter
-
Auch bei Returnwerten ist das eher unkritisch da sie auf dem Stack angelegt und nach der Zuweisung wieder verworfen werden.
Sicherlich muss ein "Return Wert" das Ergebnis auf dem Stack ablegen.
Da lokale Variablen im automatischen Speicher liegen muss dieser Wert ja "gerettet werden" um nach oben weitergegeben und wieder zerstört zu werden.
In obigem Bespiel ist der Effekt eigentlich egal, da in beiden Fällen identischer Platz verbraten wird.
Ein "Return Var1 + Var2" legt ein Zwischenergebnis an, das dann durch den Return wieder kopiert werden muss. Das Zwischenergebnis kann man natürlich auch selber anlegen und der Return kopiert dieses dann wieder.
Sehr große Zwischenergebnisse bewegen auch tatsächlich viele Bytes und zwar unabhängig davon, ob bei Varlen-Feldern alles gebraucht wird oder nicht.
Der Type Varlen (egal ob SQL oder RPG) wird nur durch Laufzeitroutinen und nicht native durch MI unterstützt.
Das Feld wird nämlich immer bis am Ende mit Leerzeichen aufgefüllt!
Dies kann man sehr schön im Debugger sehen (X-Ausgabe) oder in COBOL.
Nach der Zuweisung eines kurzen Wertes in die Variable, die vorher länger gefüllt war wird der Rest des Feldes tatsächlich initialisiert!
In COBOL wird tatsächlich eine Struktur mit der Länge (4-Byte COMP-4) und dem Inhalt definiert. COBOL unterstützt den Typ nicht native, man muss das Feld füllen und die Länge anschließend selber ausrechnen. Genau dies macht die Runtime von SQL und RPGLE.
CHAR-Felder sind also auch schneller als VARCHAR-Felder.
Man sollte sich also schon überlegen, ob Routinen dieser Art vielleicht besser die Ergebnisfelder exportieren und somit statisch anlegen. Jeder Caller ist für die schnelle Entsorgung des Ergebnis sowieso verantwortlich und Returnwerte mit 16MB sollten sowieso vermieden werden.
Similar Threads
-
By Etherion in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 03-09-14, 11:04
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 13
Letzter Beitrag: 18-05-14, 16:26
-
By Kirsten Steer in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 17-10-02, 08:59
-
By Newbie in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 04-07-02, 08:19
-
By Kent in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 19-06-01, 10:45
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks