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-Key: 393929

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

Printed on: April 23, 2024 at 16:04 o'clock

Member: emeriks
Solution emeriks Nov 26, 2018 updated at 13:23:28 (UTC)
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.
Member: MarcoBorn
MarcoBorn Nov 26, 2018 at 13:33:44 (UTC)
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
Member: SlainteMhath
Solution SlainteMhath Nov 26, 2018 at 13:48:40 (UTC)
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
Member: MarcoBorn
MarcoBorn Nov 26, 2018 at 13:59:49 (UTC)
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
Member: SlainteMhath
Solution SlainteMhath Nov 26, 2018 at 14:10:03 (UTC)
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 ...
Member: emeriks
Solution emeriks Nov 26, 2018 at 14:18:35 (UTC)
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.
Member: MarcoBorn
MarcoBorn Dec 05, 2018 at 06:58:17 (UTC)
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.