Verbessern der Enumerationsleistung

Enumerationen verwenden in der Regel eine erhebliche Menge an Systemressourcen. Daher sollten Sie versuchen, den WMI-Enumerationsprozess zu optimieren, wenn Sie Enumerationen für eine große Gruppe ausführen möchten. Skripts können auch eine Abfrage verwenden, um Leistungseinbußen bei "For each....Next"-Vorgängen mit einer großen Menge zu vermeiden. Weitere Informationen finden Sie unter Abfragen von WMI.

Im folgenden Verfahren wird beschrieben, wie die Enumerationsleistung verbessert wird.

So verbessern Sie die Enumerationsleistung

  1. Legen Sie den lFlags-Parameter fest, um die semisynchrone Rückgabe der Daten mit einem Enumerator zu ermöglichen, der jedes Element bei der Übermittlung aus WMI verwirft. Weitere Informationen finden Sie unter Aufrufen einer Methode.

    Das folgende C++-Codebeispiel zeigt, wie die Flags WBEM _ FLAG RETURN _ _ IMMEDIATE und WBEM FLAG FORWARD ONLY verwendet _ _ _ werden.

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    Verwenden Sie in VBScript oder Visual Basic die Skriptflags WbemFlagReturnImmediately und WbemFlagForwardOnly aus WbemFlagEnum. Der kombinierte Wert dieser Flags ist dezimal 48.

    Die Skript- und Parameterflags führen zu folgendem Verhalten:

    • Das Flag WBEM _ FLAG RETURN _ _ IMMEDIATE oder wbemFlagReturnImmediately fordert semisynchrones Verhalten an. Der Aufruf zum Erstellen des Enumerators wird sofort zurückgegeben. Sie können dann beginnen, den empfangenen Objektsatz zu durchlaufen.
    • Das Flag WBEM _ FLAG FORWARD _ _ ONLY oder wbemFlagForwardOnly fordert einen Enumerator an, den Sie nicht zurückspulen können. Das heißt, WMI kann ein Objekt freigeben, nachdem Sie das Objekt angezeigt haben.

    In Situationen, in denen die Enumeration groß und die Anwendung sehr schnell ist, ermöglicht die Verwendung von vorwärts gerichteten Enumeratoren mit semisynchroner Verarbeitung, dass WMI auf wesentlich weniger Objekte zurückgehalten wird, wodurch die Antwortzeit und die Arbeitsspeicherleistung erheblich erhöht werden.

    Das folgende VBScript-Codebeispiel zeigt, wie sie einen Aufruf mithilfe der kombinierten Flags wbemFlagReturnImmediately und wbemFlagForwardOnly ausführen, um eine Auflistung von Ereignissen aus einem Ereignisprotokoll abzurufen.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Vermeiden Sie nach Möglichkeit createInstanceEnum in C++ oder SWbemServices.InstancesOf,und verwenden Sie stattdessen ExecQuery.

    Die ExecQuery-Methode fragt WMI mithilfe von Datenbanktechnologien ab, während CreateInstanceEnum oder SWbemServices.InstancesOf WMI-Objekte aufzählt. Insbesondere kann ExecQuery bestimmte Teilmengen von Daten anfordern, die die aufzählenden Methoden nicht können.

    Da einige Anbieter nicht über Abfragefunktionen verfügen, bietet WMI eine Funktion "Postfilter", mit der WMI Instanzen verwerfen kann, die die Spezifikationen einer Abfrage nicht erfüllen. Ob ein bestimmter Anbieter dieses Feature nutzt, liegt beim Ersteller des Anbieters.

  3. Experimentieren Sie mit verschiedenen Abfragen, um zu ermitteln, was Ihnen die beste Leistung bietet.

    WMI verarbeitet abfragen beispielsweise selten effizient mit WHERE-Klauseln im Format Prop1 < "x". Im Gegensatz dazu verarbeitet WMI normalerweise Abfragen im Format KeyProp1 = "x" effizient.

Weitere Informationen finden Sie unter Aufzählen von WMI.