Amélioration des performances des énumérations

Les énumérations ont tendance à utiliser une quantité importante de ressources système. Par conséquent, vous devez essayer d’optimiser le processus d’énumération WMI si vous envisagez d’effectuer des énumérations sur un grand groupe. Les scripts peuvent également utiliser une requête pour éviter la dégradation des performances dans les opérations « For each...Next » avec un ensemble volumineux. Pour plus d'informations, consultez Interrogation de WMI.

La procédure suivante explique comment améliorer les performances des énumérations.

Pour améliorer les performances des énumérations

  1. Définissez le paramètre lFlags pour autoriser le retour semi-synchrone des données avec un énumérateur qui ignore chaque élément de WMI au moment de sa livraison. Pour plus d’informations, consultez Appel d’une méthode.

    L’exemple de code C++ suivant montre comment utiliser les indicateurs WBEM_FLAG_RETURN_IMMEDIATE et WBEM_FLAG_FORWARD_ONLY.

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    En VBScript ou Visual Basic, utilisez les indicateurs de script WbemFlagReturnImmediately et WbemFlagForwardOnly à partir de WbemFlagEnum. La valeur combinée de ces indicateurs est la décimale 48.

    Les indicateurs de script et de paramètre provoquent le comportement suivant :

    • L’indicateur WBEM_FLAG_RETURN_IMMEDIATE ou wbemFlagReturnImmediately demande un comportement semi-synchrone. L’appel pour créer l’énumérateur est retourné immédiatement. Vous pouvez ensuite commencer à parcourir le jeu d’objets que vous recevez.
    • L’indicateur WBEM_FLAG_FORWARD_ONLY ou l’indicateur wbemFlagForwardOnly demande un énumérateur que vous ne pouvez pas rembobiner. Autrement dit, WMI peut libérer un objet une fois que vous avez consulté.

    Dans les cas où l’énumération est volumineuse et l’application très rapide, l’utilisation d’énumérateurs vers l’avant uniquement avec traitement semi-synchrone permet à WMI de conserver beaucoup moins d’objets, ce qui augmente considérablement le temps de réponse et les performances de mémoire.

    L’exemple de code VBScript suivant montre comment effectuer un appel à l’aide des indicateurs combinés wbemFlagReturnImmediately et wbemFlagForwardOnly pour obtenir une collection d’événements à partir d’un journal des événements.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Dans la mesure du possible, évitez d’utiliser CreateInstanceEnum en C++ ou SWbemServices.InstancesOf, et utilisez ExecQuery à la place.

    La méthode ExecQuery interroge WMI à l’aide de technologies de base de données, tandis que CreateInstanceEnum ou SWbemServices.InstancesOf énumère les objets WMI. Plus précisément, ExecQuery peut demander des sous-ensembles de données spécifiques que les méthodes d’énumération ne peuvent pas demander.

    Étant donné que certains fournisseurs ne disposent pas de fonctionnalités d’interrogation, WMI fournit une fonctionnalité de « post-filtrage » qui permet à WMI d’ignorer les instances qui ne répondent pas aux spécifications d’une requête. C’est à l’auteur d’un fournisseur particulier de déterminer si celui-ci tire parti de cette fonctionnalité.

  3. Testez différentes requêtes pour déterminer ce qui vous offre les meilleures performances.

    Par exemple, il est rare que WMI traite efficacement les requêtes avec des clauses WHERE au format Prop1 < "x". En revanche, en général, WMI traite efficacement les requêtes au format KeyProp1 = "x".

Pour plus d’informations, consultez Énumération de WMI.