Partilhar via


Melhorando 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 WMI se você 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 "Para cada....Next" com um conjunto grande. Para obter mais informações, consulte Consultando o WMI.

O procedimento a seguir descreve como melhorar o desempenho da enumeração.

Para melhorar o desempenho da enumeração

  1. Defina o parâmetro lFlags para permitir o retorno dos dados de forma semissíncrona com um enumerador que descarta cada item do WMI à medida que é recebido. Para obter mais informações, consulte chamando 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

    Em VBScript ou Visual Basic, use os sinalizadores de script WbemFlagReturnImmediately e WbemFlagForwardOnly de WbemFlagEnum. O valor combinado desses sinalizadores é decimal 48.

    Os sinalizadores de script e parâmetro causam o seguinte comportamento:

    • O WBEM_FLAG_RETURN_IMMEDIATE ou a flag wbemFlagReturnImmediately solicita comportamento semissíncrono. A chamada para criar o enumerador retorna imediatamente. Você pode então começar a percorrer o conjunto de objetos que recebe.
    • O sinalizador WBEM_FLAG_FORWARD_ONLY ou wbemFlagForwardOnly solicita um enumerador que não se pode retroceder. Ou seja, o WMI pode liberar um objeto depois de você visualizar o objeto.

    Em situações em que a enumeração é grande e o aplicativo é muito rápido, o uso de enumeradores somente para 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 as flags combinadas wbemFlagReturnImmediately e wbemFlagForwardOnly 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)
    
  2. Sempre que possível, evite usar CreateInstanceEnum em C++ ou SWbemServices.InstancesOfe, em vez disso, use ExecQuery.

    O método ExecQuery consulta WMI usando tecnologias de banco de dados, enquanto CreateInstanceEnum ou SWbemServices.InstancesOf enumera objetos WMI. Especificamente, ExecQuery pode solicitar subconjuntos específicos de dados que os métodos de enumeração não podem.

    Como alguns provedores não têm recursos de consulta, o WMI fornece um recurso de "filtro de postagem" que permite ao WMI descartar instâncias que não atendem às especificações de uma consulta. Se um determinado provedor aproveita esse recurso cabe ao autor do provedor.

  3. Experimente diferentes consultas para determinar o que lhe dá o melhor desempenho.

    Por exemplo, o WMI raramente processa consultas de forma eficiente com cláusulas WHERE do tipo Prop1 < "x". Em contraste, WMI normalmente processa consultas do formulário KeyProp1 = "x" de forma eficiente.

Para obter mais informações, consulte Enumerando WMI.