列舉通常會使用大量的系統資源。 因此,如果您打算在大型群組上執行列舉,您應該嘗試優化 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 和 WbemFlagForwardOnlyWbemFlagEnum。 這些旗標的合併值為十進位 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)
盡可能避免在 C++ 或 SWbemServices.InstancesOf中使用 CreateInstanceEnum,請改用 ExecQuery。
ExecQuery 方法會使用資料庫技術查詢 WMI,而 CreateInstanceEnum 或 SWbemServices.InstancesOf 列舉 WMI 物件。 具體來說,ExecQuery 可以要求列舉方法無法的特定數據子集。
由於某些提供者沒有查詢功能,因此 WMI 提供「後置篩選」功能,可讓 WMI 捨棄不符合查詢規格的實例。 特定提供者是否利用這項功能,由提供者作者決定。
試驗不同的查詢,以判斷哪一個能為您提供最佳效能。
例如,WMI 很少有效率地處理具有格式 Prop1 < “x” 之 WHERE 子句的查詢。 相反地,WMI 通常會有效率地處理 KeyProp1 = “x” 格式的查詢。
如需詳細資訊,請參閱 列舉 WMI。