Mejora del rendimiento de las enumeraciones

Las enumeraciones tienden a usar una cantidad significativa de recursos del sistema. Por consiguiente, si planea realizar enumeraciones en un grupo grande, debe intentar optimizar el proceso de enumeración de WMI. Los scripts también pueden usar una consulta para evitar la degradación del rendimiento en las operaciones "For each....Next" con un conjunto grande. Para más información, vea Consulta de WMI.

En el procedimiento siguiente se describe cómo mejorar el rendimiento de las enumeraciones.

Para mejorar el rendimiento de las enumeraciones

  1. Establezca el parámetro lFlags para permitir la devolución semisincrónica de los datos con un enumerador que descarta cada elemento de WMI cuando se entrega. Para más información, consulte Llamada a un método.

    En el siguiente ejemplo de código de C++ se muestra cómo usar las marcas WBEM_FLAG_RETURN_IMMEDIATE y WBEM_FLAG_FORWARD_ONLY.

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    En VBScript o Visual Basic, use las marcas de scripting WbemFlagReturnImmediately y WbemFlagForwardOnly de WbemFlagEnum. El valor combinado de estas marcas es 48 decimal.

    Las marcas de scripting y parámetros provocan el siguiente comportamiento:

    • Las marcas WBEM_FLAG_RETURN_IMMEDIATE o wbemFlagReturnImmediately solicitan un comportamiento semisincrónico. La llamada para crear el enumerador devuelve inmediatamente. Luego, puede empezar a recorrer el conjunto de objetos que reciba.
    • Las marcas WBEM_FLAG_FORWARD_ONLY o wbemFlagForwardOnly solicita un enumerador que no se puede rebobinar. Es decir, WMI puede liberar un objeto después de ver el objeto.

    En situaciones en las que la enumeración es grande y la aplicación es muy rápida, el uso de enumeradores de solo avance con procesamiento semisincrónico permite que WMI se mantenga en muchos menos objetos, lo que aumenta considerablemente el rendimiento de la memoria y el tiempo de respuesta.

    En el siguiente ejemplo de código de VBScript se muestra cómo realizar una llamada mediante las combinación de las marcas wbemFlagReturnImmediately y wbemFlagForwardOnly para obtener una colección de eventos de un registro de eventos.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Siempre que sea posible, evite usar CreateInstanceEnum en C++ o SWbemServices.InstancesOf, use ExecQuery en su lugar.

    El método ExecQuery consulta WMI mediante tecnologías de base de datos, mientras que CreateInstanceEnum o SWbemServices.InstancesOf enumeran objetos de WMI. En concreto, ExecQuery puede solicitar subconjuntos específicos de datos que los métodos de enumeración no pueden solicitar.

    Como algunos proveedores no tienen funcionalidades de consulta, WMI proporciona una característica de "posterior al filtrado" que permite a WMI descartar aquellas instancias que no cumplan las especificaciones de una consulta. El creador de cada proveedor es quien decide si el proveedor aprovecha esta característica.

  3. Experimente con diferentes consultas para determinar qué proporciona el mejor rendimiento.

    Por ejemplo, WMI rara vez procesa consultas de forma eficaz con cláusulas WHERE que tengan la forma Prop1 < "x". Por el contrario, WMI normalmente procesa de forma eficaz las consultas que tengan la forma KeyProp1 = "x".

Para más información, consulte Enumerar WMI.