marcoborn
Goto Top

Frage zur Variablendefinition

Hallo Forum,
ich habe eine EXE-Datei in VB.NET geschrieben, die ca. 200 Prozeduren und Methoden umfasst. In den meisten davon wird auf ein Excel- und ein Word-Objekt zugegriffen, die ganz am Anfang des Tools als Variablen angelegt werden.
Welche Form der Variablendefinition ist am sinnvollsten:
- Definition von 2 globalen Variablen
- Definition von lokalen Variablen in jeder Prozedur und dann Verweis auf die aktuelle Instanz von Word bzw. Excel
- Definition von 2 lokalen Variablen in der Start-Prozedur und Übergabe der Variablen als Parameter an die einzelnen Prozeduren

Ich möchte, dass mein Tool möglichst Ressourcen-schonend und schnell arbeitet. Welche Variante wäre hierfür am sinnvollsten?

Vielen Dank im voraus,
M. Born

Content-ID: 393929

Url: https://administrator.de/contentid/393929

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

emeriks
Lösung emeriks 26.11.2018 aktualisiert um 14:23:28 Uhr
Goto Top
Hi,
rein auf die Ressourcen bezogen - nur zwei globale Variablen. Weil dann eben nur 2 Zeiger auf jeweils ein Objekt.
Wenn Du je Prozedure die Vaiablen jeweils als Parameter übergibts, dann kopierst Du nur die Zeiger auf die jeweiligen Objekte, aber die Objekte bleiben dieselben. Ob sich das aber merklich auf die Leistung auswirkt sei dahingestellt.

E.
MarcoBorn
MarcoBorn 26.11.2018 um 14:33:44 Uhr
Goto Top
Hallo emeriks,
ich hatte vorher mein Projekt als XLL-Datei programmiert, musste jetzt aber eine EXE daraus machen. Die Durchlaufzeit des Codes hat sich von wenigen Minuten auf fast 10 Stunden erhöht. Da ich bisher in jeder Prozedur eine lokale Variable erstellt hatte und der dann die laufende Office-Instanz zugewiesen habe, dachte ich, dies könnte ggf. die Ursache des Problems sein. Ich erzeuge ja schließlich viele Variablen, die denselben Inhalt besitzen, wodurch u.U. der RAM-Verbrauch und die Durchlaufzeiten sich deutlich erhöhen. Bevor ich alles auf globale Variablen umstelle, wollte ich halt nur eine Bestätigung, dass es auch einen merklichen Performancegewinn dadurch gibt.

Woran könnte die deutlich längere Laufzeit noch liegen?

Vielen Dank,
M. Born
SlainteMhath
Lösung SlainteMhath 26.11.2018 um 14:48:40 Uhr
Goto Top
Moin,

wenn du von "Variablen" sprichst, meinst du a) Datentype im "herkömmlichen" Sinne (int, byte, string, boolean) oder sprichst du b) von Objekten/Klassen (Excel Worksheet, Word Document usw)?

Falls b) ist der RAM und Zeitverbrauch "normal", wenn du jedesmal eine neues Objekt mit lokalem Scope anlegst.

Ohne deinen Code zu kennen: Evtl. kannst du das ganze als Klasse umbauen und dann Klassen-lokale Objekt oder Unterklassen verwenden. Das sollte dann Zeit als auch RAM einsprachen.

lg,
Slainte
MarcoBorn
MarcoBorn 26.11.2018 um 14:59:49 Uhr
Goto Top
Hallo Slainte,
ich binde Word und Excel als Objekt ein:
Imports Excel = NetOffice.ExcelApi
Imports Word = NetOffice.WordApi
...
Dim objDOKAppXL As Excel.Application = Excel.Application.GetActiveInstance.Application
Dim objDOKAppWD As Word.Application = Word.Application.GetActiveInstance.Application

Ich werde mal versuchen, den Code auf globale Variablen umzustellen. Was meinst Du mit "das ganze als Klasse umbauen und dann Klassen-lokale Objekt oder Unterklassen verwenden"?

Viele Grüße,
M. Born
SlainteMhath
Lösung SlainteMhath 26.11.2018 um 15:10:03 Uhr
Goto Top
Was meinst Du mit "das ganze als Klasse umbauen und dann Klassen-lokale Objekt oder Unterklassen verwenden"?

Hier ist das ganz gut erklärt:
https://code.sp-datenbank.de/23-coding/visual-basic/tutorials/11-objekto ...
emeriks
Lösung emeriks 26.11.2018 um 15:18:35 Uhr
Goto Top
Dim objDOKAppXL As Excel.Application = Excel.Application.GetActiveInstance.Application
Wenn es dabei immer um dieselbe Instanz geht, warum sollte man diese dann immer wieder abfragen? Einmal reicht.
MarcoBorn
MarcoBorn 05.12.2018 um 07:58:17 Uhr
Goto Top
Ich habe jetzt alle Prozeduren so umgeschrieben, dass nur noch 1 globale Variable genutzt wird. Die Performance ist deutlich besser geworden. Vielen Dank an alle.