Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Перечисления, как правило, используют значительное количество системных ресурсов. Поэтому, если вы планируете выполнять перечисления на большой группе объектов, вам следует попытаться оптимизировать процесс перечисления WMI. Скрипты также могут использовать запрос, чтобы избежать снижения производительности в конструкциях "For each...Next" при работе с большими наборами данных. Дополнительные сведения см. в разделе Запросы WMI.
В следующей процедуре описывается улучшение производительности перечисления.
Улучшение производительности перечисления
Задайте параметр 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)По возможности избегайте использования CreateInstanceEnum в C++ или SWbemServices.InstancesOfи вместо этого используйте ExecQuery.
Метод ExecQuery запрашивает WMI с помощью технологий базы данных, а CreateInstanceEnum или SWbemServices.InstancesOf перечисляет объекты WMI. В частности, ExecQuery может запрашивать определенные подмножества данных, которые недоступны методам перечисления.
Так как у некоторых поставщиков нет возможностей запроса, WMI предоставляет функцию "post filter", которая позволяет WMI удалять экземпляры, которые не соответствуют спецификациям запроса. Будет ли конкретный поставщик использовать эту функцию, зависит от автора поставщика.
Поэкспериментируйте с различными запросами, чтобы определить, что обеспечивает оптимальную производительность.
Например, WMI редко эффективно обрабатывает запросы с предложениями WHERE в форме Prop1 < "x". В отличие от этого, WMI обычно обрабатывает запросы формы KeyProp1 = "x" эффективно.
Дополнительные сведения о WMI см. в разделе Перечисление.