Klasseneinteilung und Performance
Hallo Forum,
ich habe in VB.Net eine Dll geschrieben, die u.a. Excel und Word startet und zwischen diesen beiden Programmen Daten austauscht etc.
Das Tool braucht ca. 20 Minuten für einen Durchlauf und Excel bläht sich von 100.000k auf mehr als 800.000k RAM auf.
Ist es sinnvoller, die Funktionen jeweils in einzelne Klassen aufzuteilen oder alles in 1 Klasse zu packen? Sollte man Variablen eher lokal oder global definieren? Gibt es außer dem Setzen auf Nothing noch andere Möglichkeiten, den Speicherbedarf zu reduzieren?
Vielen Dank im voraus,
M. Born
ich habe in VB.Net eine Dll geschrieben, die u.a. Excel und Word startet und zwischen diesen beiden Programmen Daten austauscht etc.
Das Tool braucht ca. 20 Minuten für einen Durchlauf und Excel bläht sich von 100.000k auf mehr als 800.000k RAM auf.
Ist es sinnvoller, die Funktionen jeweils in einzelne Klassen aufzuteilen oder alles in 1 Klasse zu packen? Sollte man Variablen eher lokal oder global definieren? Gibt es außer dem Setzen auf Nothing noch andere Möglichkeiten, den Speicherbedarf zu reduzieren?
Vielen Dank im voraus,
M. Born
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 232602
Url: https://administrator.de/forum/klasseneinteilung-und-performance-232602.html
Ausgedruckt am: 10.04.2025 um 21:04 Uhr
15 Kommentare
Neuester Kommentar
Hallo M. Born,
Da uns hier der Code fehlt ist eine Einschätzung in deinem Fall schwierig. Kommt halt sehr darauf an wie dein Code aufgebaut ist, da hat jeder seinen eigenen Stil.
Du hast aber die Möglichkeit die Garbage Collection manuell aufzurufen und damit unbenötigte Resourcen freizugeben:
Viele Objekte bieten auch eine Dispose() Methode wenn sie nicht mehr gebraucht werden.
Grüße Uwe
Da uns hier der Code fehlt ist eine Einschätzung in deinem Fall schwierig. Kommt halt sehr darauf an wie dein Code aufgebaut ist, da hat jeder seinen eigenen Stil.
Du hast aber die Möglichkeit die Garbage Collection manuell aufzurufen und damit unbenötigte Resourcen freizugeben:
GC.Collect()
Grüße Uwe
Mein Code umfasst ca. 20 Funktionen und Prozeduren mit ca 1800 LOC
das ist ja noch winzig Ich denke es kommt eher darauf an wie viel Objekte du von den Klassen generierst. Wenn also oft neue Objekte dieser zwei Klassen erstellt werden wäre es sicher vorteilhafter sie aufzuteilen. Aber ich würde eher ein Augenmerk auf neu erzeugte Variablen in Schleifen werfen.
Grüße Uwe
Dann wäre vielleicht mal ein Performance Monitoring deiner Applikation angedacht bei der du die Größen der Objekte und den Garbage-Collector überwachst. Mehr dazu steht hier:http://msdn.microsoft.com/en-us/library/ff647791.aspx (Abschnitt CLR and Managed Code)
Grüße Uwe
Grüße Uwe
Zitat von @MarcoBorn:
Danke für den Link. Ich schaue mir das mal an. Obwohl ich den GC mehrmals in die Hauptfunktion eingebaut habe, scheint es
keinen Einfluss zu haben. Das Tool läuft gerade durch, ist aber schon wieder größer als 700MB.
mehrfaces aufrufen hintereinander ist keine so gute Idee, das erledigt NET normalerweise automatisch, aber was macht das Tool denn so, wenn man fragen darf ?Danke für den Link. Ich schaue mir das mal an. Obwohl ich den GC mehrmals in die Hauptfunktion eingebaut habe, scheint es
keinen Einfluss zu haben. Das Tool läuft gerade durch, ist aber schon wieder größer als 700MB.
Bzw. wo und wie nutzt du die DLL ? 700MB ist heftig...
Zitat von @MarcoBorn:
Wenn ich die Datei als Verweis in SharpDevelop einbinde, stürzt mir die IDE ab. In VS Express kann ich sie zwar einbinden,
aber wenn aus der DLL heraus Excel gestartet werden soll, stürzt die Exe ebenfalls ab.
Da stimmt dann aber etwas nicht, bzw. irgendwo wird da ein ganz grober Fehler in der DLL eingebaut sein, vermutlich deshalb auch der enorme Speicherverbrauch.... Sicherstellen das kritische Stellen mit Try...Catch Konstrukten abgesichert sind!Wenn ich die Datei als Verweis in SharpDevelop einbinde, stürzt mir die IDE ab. In VS Express kann ich sie zwar einbinden,
aber wenn aus der DLL heraus Excel gestartet werden soll, stürzt die Exe ebenfalls ab.
Hier hilft dir normalerweise der Debugger von VS.
Bist du Sicher das ExcelDNA hier nicht der Übeltäter ist ? lässt sich einfach feststellen, indem man stattdessen nur mal mit der lokal installierten Interop-Excel arbeitet.
Zitat von @MarcoBorn:
nachfragen. Kann es ggf. daran liegen, dass man eine XLL nicht aus einer EXE heraus aufrufen kann?
meinst du mit XLL eine Excel Addin DLL? das hätte man wissen müssen.nachfragen. Kann es ggf. daran liegen, dass man eine XLL nicht aus einer EXE heraus aufrufen kann?