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" quando si lavora con un set di grandi dimensioni. Per altre informazioni, vedere Eseguire query su WMI.
La procedura seguente descrive come migliorare le prestazioni dell'enumerazione.
Per migliorare le prestazioni di enumerazione
Impostare il parametro lFlags per consentire la restituzione semisincroma dei dati con un enumeratore che elimina ogni elemento da WMI durante la consegna. Per ulteriori informazioni, vedere Chiamata di un metodo.
Nell'esempio di codice C++ seguente viene illustrato come usare i flag WBEM_FLAG_RETURN_IMMEDIATE e WBEM_FLAG_FORWARD_ONLY.
WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY
In VBScript o in Visual Basic, utilizzare 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 un comportamento semisynchrono. 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 puoi riavvolgere. Ovvero, WMI può rilasciare un oggetto dopo la visualizzazione dell'oggetto.
In situazioni in cui l'enumerazione è di grandi dimensioni e l'applicazione è molto veloce, l'uso di enumeratori forward-only con l'elaborazione semisincrona consente a WMI di contenere fino a un minor numero di oggetti, aumentando in tal modo significativamente 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 log degli eventi.
Set Events = GetObject("winmgmts:").ExecQuery _ ("SELECT * FROM Win32_NTLogEvent " _ & "WHERE Logfile = 'System'",,48)
Quando possibile, evitare di usare CreateInstanceEnum in C++ o SWbemServices.InstancesOfe usare ExecQuery.
Il metodo ExecQuery esegue 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 fornisce una funzionalità di "post filtro" che consente a WMI di eliminare le istanze che non soddisfano le specifiche di una query. Spetta all'autore del provider decidere se un provider specifico sfrutta questa funzionalità.
Sperimenta diverse query per determinare quale prestazione ti offre i risultati migliori.
Ad esempio, WMI elabora raramente le query con clausole WHERE del form Prop1 < "x". Al contrario, WMI elabora in genere le query del formato KeyProp1 = "x" in modo efficiente.
Per altre informazioni, vedere Enumerating WMI.