Hallo Forum,
wir sind Anbieter einer Branchensoftware für Steuerberater und bieten unter anderem eine Funktion zum Erstellen von Serienbriefen aus unserer Software heraus an. Wir haben nun festgestellt, dass diese Funktion auf virtuellen Maschinen extreme Performance
Einbrüche erleidet, wenn der Vorgang der Dokumentenerstellung z.B. von einer Messagebox "unterbrochen" wird.
Beispiel: Word wird im Hintergrund gestartet, eine Dokumentenvorlage geladen und die Adressfelder befüllt. Dann wird erkannt, dass der Kunde für die fachlich Korrekte Verarbeitung eine Entscheidung treffen muss. Z.B., ob der Brief mit den Daten von Kind
1 oder Kind 2 zu befüllen ist. Entsprechend wird eine Messagebox angezeigt. Sobald diese Messagebox geschossen wird, wird die Serienbrieferstellung fortgesetzt - benötigt jetzt aber 10-12 mal so lange, wie vor der Anzeige der Messagebox.
Meine bisherigen Recherchen haben ergeben, dass die Ursache im Bereich Hyper-V und Hyper-Threading zu suchen ist, da das Problem auf "normalen Blechen" nicht auftritt. Das Deaktivieren von Hyper-Threading (was als Standardlösung gehandelt wird)
ist keine Option, da wir Serverkapazität in einem Rechenzentrum angemietet und keinen Einfluss auf die Hosts haben.
Das Problem lässt sich auch mit einem einfach VB-Script nachstellen und kann daher ursächlich von unserer Software entkoppelt betrachtet werden:
Set objWord = CreateObject("Word.Application")
Wscript.Echo "Version: " & objWord.Version
Wscript.Echo "Build: " & objWord.Build
Wscript.Echo "Product Code: " & objWord.ProductCode()
objWord.Visible = True
objWord.Documents.Add
startLoop1 = timer()
For i = 1 To 100
thisStart = timer()
objWord.Selection.TypeText "Ich tippe was... "
objWord.Selection.TypeText "Dauer: "
objWord.Selection.TypeText cstr(FormatNumber(timer() - thisStart,10, vbTrue))
objWord.Selection.TypeText "s"
objWord.Selection.TypeParagraph
if i = 50 then
endLoop1 = timer()
dummy = InputBox("Gib irgendwas ein...")
startLoop2 = timer()
end if
Next
endLoop2 = timer()
objWord.Selection.TypeText "Laufzeit 1-50: " & cstr(FormatNumber(endLoop1-startLoop1,10, vbTrue))
objWord.Selection.TypeParagraph
objWord.Selection.TypeText "Laufzeit 51-100: " & cstr(FormatNumber(endLoop2-startLoop2,10, vbTrue))
objWord.Selection.TypeParagraph
Die ersten 50 Interationen dauern ca. 6 Sekunden, die nächsten 50 - nach Anzeige der Messagebox - im schlimmsten getesteten Fall bis zu 90 Sekunden.
Hat jemand eine Idee?
Vielen Dank und schöne Grüße,
Martin