Повышение производительности перечисления

Перечисления, как правило, используют значительный объем системных ресурсов. Поэтому следует попытаться оптимизировать процесс перечисления WMI, если вы планируете выполнять перечисления в большой группе. Скрипты также могут использовать запрос, чтобы избежать снижения производительности в операциях "For each....Next" с большим набором. Дополнительные сведения см. в разделе Запрос WMI.

В следующей процедуре описывается, как повысить производительность перечисления.

Повышение производительности перечисления

  1. Задайте параметр lFlags , чтобы разрешить полусинхронное возвращение данных с помощью перечислителя, который удаляет каждый элемент из WMI по мере его доставки. Дополнительные сведения см. в разделе Вызов метода .

    В следующем примере кода C++ показано, как использовать флаги WBEM_FLAG_RETURN_IMMEDIATE и WBEM_FLAG_FORWARD_ONLY .

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    В VBScript или Visual Basic используйте флаги сценариев WbemFlagReturnImmediately и WbemFlagForwardOnly из WbemFlagEnum. Объединенное значение этих флагов равно десятичному разряду 48.

    Флаги скриптов и параметров вызывают следующее поведение:

    • Флаг WBEM_FLAG_RETURN_IMMEDIATE или wbemFlagReturnImmediately запрашивает полусинхронное поведение. Вызов для создания перечислителя возвращается немедленно. Затем можно приступить к просмотру получаемого набора объектов.
    • Флаг WBEM_FLAG_FORWARD_ONLY или флаг wbemFlagForwardOnly запрашивает перечислитель, который нельзя перемотать. То есть WMI может освободить объект после его просмотра.

    В ситуациях, когда перечисление большое и приложение работает очень быстро, использование перечислителей только вперед с полусинхронной обработкой позволяет WMI удерживать гораздо меньше объектов, тем самым значительно увеличивая время отклика и производительность памяти.

    В следующем примере кода VBScript показано, как выполнить вызов с помощью объединенных флагов wbemFlagReturnImmediately и wbemFlagForwardOnly для получения коллекции событий из журнала событий.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. По возможности избегайте использования CreateInstanceEnum в C++ или SWbemServices.InstancesOf, а вместо этого используйте ExecQuery.

    Метод ExecQuery запрашивает WMI с использованием технологий баз данных, а CreateInstanceEnum или SWbemServices.InstancesOf перечисляет объекты WMI. В частности, ExecQuery может запрашивать определенные подмножества данных, что методы перечисления не могут.

    Поскольку некоторые поставщики не имеют возможностей запросов, WMI предоставляет функцию "post filter", которая позволяет WMI удалять экземпляры, которые не соответствуют спецификациям запроса. Указывает, использует ли конкретный поставщик преимущества этой функции, автор поставщика.

  3. Экспериментируйте с различными запросами, чтобы определить, что обеспечивает лучшую производительность.

    Например, WMI редко эффективно обрабатывает запросы с помощью предложений WHERE формы Prop1 < "x". В отличие от этого, WMI обычно эффективно обрабатывает запросы в формате KeyProp1 = "x".

Дополнительные сведения см. в разделе Перечисление WMI.