Freigeben über


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 in "For each....Next"-Vorgängen mit zahlreichen Datensätzen 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 Parameter lFlags fest, um die halbsynchrone Rückgabe der Daten mit einem Enumerator zu ermöglichen, der jedes Element aus WMI verwirft, während es übermittelt wird. Weitere Informationen finden Sie unter Aufrufen einer Methode.

    Im folgenden C++-Codebeispiel wird gezeigt, 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:

    • Die FlagsWBEM_FLAG_RETURN_IMMEDIATE oder wbemFlagReturnImmediately fordern halbsynchrones Verhalten an. Der Aufruf zum Erstellen des Enumerators wird sofort zurückgegeben. Anschließend können Sie mit dem Durchsuchen des empfangenen Objektsatzes beginnen.
    • Das Flag WBEM_FLAG_FORWARD_ONLY oder das Flag wbemFlagForwardOnly-Flag 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ß ist und die Anwendung sehr schnell ist, ermöglicht die Verwendung von Forward-Enumeratoren mit halbsynchroner Verarbeitung WMI, weit weniger Objekte zu speichern, wodurch die Antwortzeit und die Arbeitsspeicherleistung erheblich erhöht werden.

    Das folgende VBScript-Codebeispiel zeigt, wie Sie einen Aufruf mit den kombinierten Flags wbemFlagReturnImmediately und wbemFlagForwardOnly durchfü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 Enumerationsmethoden nicht können.

    Da einige Anbieter nicht über Abfragefunktionen verfügen, stellt WMI eine Funktion "Nachfilter" bereit, mit der WMI Instanzen verwerfen kann, die die Spezifikationen einer Abfrage nicht erfüllen. Ob ein bestimmter Anbieter dieses Feature nutzt, liegt beim Anbieterautor.

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

    Beispielsweise verarbeitet WMI selten effizient Abfragen mit WHERE-Klauseln der Form Prop1 < "x". Im Gegensatz dazu verarbeitet WMI Abfragen der Form KeyProp1 = "x" normalerweise effizient.

Weitere Informationen finden Sie unter WMI-Enumeration.