Miglioramento delle prestazioni dell'enumerazione

Le enumerazioni tendono a usare una quantità significativa di risorse di sistema. Pertanto, è consigliabile provare a ottimizzare il processo di enumerazione WMI se si prevede di eseguire enumerazioni in un gruppo di grandi dimensioni. Gli script possono anche usare una query per evitare una riduzione delle prestazioni nelle operazioni "For each....Next" con un set di grandi dimensioni. Per altre informazioni, vedere Esecuzione di query su WMI.

La procedura seguente descrive come migliorare le prestazioni dell'enumerazione.

Per migliorare le prestazioni di enumerazione

  1. Impostare il parametro lFlags per consentire la restituzione semiincrona dei dati con un enumeratore che rimuove ogni elemento da WMI durante il recapito. Per altre informazioni, vedere Chiamata di un metodo.

    L'esempio di codice C++ seguente illustra come usare i flag WBEM_FLAG_RETURN_IMMEDIATE e WBEM_FLAG_FORWARD_ONLY .

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    In VBScript o Visual Basic usare i flag di scripting WbemFlagReturnImmediately e WbemFlagForwardOnly da WbemFlagEnum. Il valore combinato di questi flag è decimale 48.

    Gli script e i flag dei parametri causano il comportamento seguente:

    • Il flag WBEM_FLAG_RETURN_IMMEDIATE o wbemFlagReturnImmediately richiede il comportamento semisynchronous. La chiamata per creare l'enumeratore restituisce immediatamente. È quindi possibile iniziare a attraversare il set di oggetti ricevuto.
    • Il flag WBEM_FLAG_FORWARD_ONLY o wbemFlagForwardOnly richiede un enumeratore che non è possibile riavvolgere. Ovvero, WMI può rilasciare un oggetto dopo aver visualizzato l'oggetto.

    Nelle situazioni in cui l'enumerazione è di grandi dimensioni e l'applicazione è molto veloce, l'uso di enumeratori forward-only con l'elaborazione semisynchrono consente a WMI di mantenere un numero molto inferiore di oggetti, aumentando in modo significativo il tempo di risposta e le prestazioni di memoria.

    Nell'esempio di codice VBScript seguente viene illustrato come effettuare una chiamata usando i flag wbemFlagReturnImmediately e wbemFlagForwardOnly per ottenere una raccolta di eventi da un registro eventi.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Quando possibile, evitare di usare CreateInstanceEnum in C++ o SWbemServices.InstancesOf e usare invece ExecQuery.

    Il metodo ExecQuery esegue una query WMI usando tecnologie di database, mentre CreateInstanceEnum o SWbemServices.InstancesOf enumera oggetti WMI. In particolare , ExecQuery può richiedere subset specifici di dati che i metodi di enumerazione non possono.

    Poiché alcuni provider non dispongono di funzionalità di query, WMI offre una funzionalità di "post filtro" che consente a WMI di eliminare le istanze che non soddisfano le specifiche di una query. Indica se un provider specifico sfrutta questa funzionalità spetta all'autore del provider.

  3. Sperimentare con query diverse per determinare cosa offre le migliori prestazioni.

    Ad esempio, WMI elabora raramente in modo efficiente le query con clausole WHERE nel formato Prop1 < "x". WMI elabora in genere le query del formato KeyProp1 = "x" in modo efficiente.

Per altre informazioni, vedere Enumerazione WMI.