none
Unter Hyper-V: Word 2013 Automatisierung/ OLE ist extrem langsam RRS feed

  • Frage

  • 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

    Freitag, 4. Dezember 2015 10:26

Antworten

  • Hallo Martin, 

    VB und eure Software kommen wahrscheinlich noch aus einer Zeit wo Hyperthreading und Virtualisierung noch kein Thema waren. 

    Ich bin kein Entwickler aber Software muss für die Verwendung auf virtuellen Threats und Hardware angepasst werden. 

    Beispiel aus meiner Vergangenheit. 

    Ich hatte mal einen Kunden mit MS SQL Server 2005 ... um seine Performance zu steigern, hat er seinen Server von 8-Core 2,6 GHz CPU auf 16-Core 2,2 GHz CPU umgestellt. Die SQL DB war aber von der Performance her langsamer als vorher. Warum? Weil die Datenbanken eigentlich nur die ersten 2 Cores verwendet hat und bei den neuen Server war die Taktzahl geringer. 

    Änderung haben damals nur einige Patches und am Ende ein DB Upgrad auf 2008 gebracht. 

    LG 

    Flo


    Kind regards, Flo

    Freitag, 4. Dezember 2015 19:30