Melhorar o desempenho da enumeração
As enumerações tendem a usar uma quantidade significativa de recursos do sistema. Portanto, você deve tentar otimizar o processo de enumeração do WMI se planeja executar enumerações em um grupo grande. Os scripts também podem usar uma consulta para evitar a degradação do desempenho em operações "For each....Next" com um conjunto grande. Para obter mais informações, confira Consultar o WMI.
O procedimento a seguir descreve como melhorar o desempenho da enumeração.
Para melhorar o desempenho da enumeração
Defina o parâmetro lFlags para permitir o retorno semissíncrono dos dados com um enumerador que descarta cada item do WMI conforme ele é entregue. Para obter mais informações, consulte Chamar um método.
O exemplo de código C++ a seguir mostra como usar os sinalizadores WBEM_FLAG_RETURN_IMMEDIATE e WBEM_FLAG_FORWARD_ONLY.
WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY
No VBScript ou no Visual Basic, use os sinalizadores de script WbemFlagReturnImmediately e WbemFlagForwardOnly em WbemFlagEnum. O valor combinado desses sinalizadores é 48 decimal.
Os sinalizadores de script e parâmetro causam o seguinte comportamento:
- O sinalizador WBEM_FLAG_RETURN_IMMEDIATE ou wbemFlagReturnImmediately solicita comportamento semissíncrono. A chamada para criar o enumerador é imediatamente retornada. Em seguida, você pode começar a percorrer o conjunto de objetos que você recebe.
- O sinalizador WBEM_FLAG_FORWARD_ONLY ou wbemFlagForwardOnly solicita um enumerador que você não pode retroceder. Ou seja, o WMI pode liberar um objeto depois de exibir o objeto.
Em situações em que a enumeração é grande e o aplicativo é muito rápido, usar enumeradores somente de encaminhamento com processamento semissíncrono permite que o WMI mantenha muito menos objetos, aumentando significativamente o tempo de resposta e o desempenho da memória.
O exemplo de código VBScript a seguir mostra como fazer uma chamada usando os sinalizadores wbemFlagReturnImmediately e wbemFlagForwardOnly combinados para obter uma coleção de eventos de um log de eventos.
Set Events = GetObject("winmgmts:").ExecQuery _ ("SELECT * FROM Win32_NTLogEvent " _ & "WHERE Logfile = 'System'",,48)
Sempre que possível, evite usar CreateInstanceEnum em C++ ou SWbemServices.InstancesOf e use ExecQuery.
O método ExecQuery consulta o WMI usando tecnologias de banco de dados, enquanto CreateInstanceEnum ou SWbemServices.InstancesOf enumera objetos do WMI. Especificamente, ExecQuery consegue solicitar subconjuntos específicos de dados que os métodos de enumeração não conseguem.
Como alguns provedores não têm recursos de consulta, o WMI fornece um recurso "pós-filtro" que permite que o WMI descarte instâncias que não atendem às especificações de uma consulta. Cabe ao autor do provedor decidir se um provedor específico aproveita esse recurso.
Experimente consultas diferentes para determinar qual oferece o melhor desempenho.
Por exemplo, o WMI raramente processa consultas eficientemente com cláusulas WHERE do formulário Prop1 < "x". Por outro lado, o WMI normalmente processa consultas do formulário KeyProp1 = "x" com eficiência.
Para obter mais informações, consulte Enumerar o WMI.