改善列舉效能
列舉通常會使用大量的系統資源。 因此,如果您打算在大型群組上執行列舉,您應該嘗試優化 WMI 列舉程式。 腳本也可以使用查詢來避免「針對每個...下一個」作業具有大型集合的效能降低。 如需詳細資訊,請參閱 查詢 WMI。
下列程式描述如何改善列舉效能。
改善列舉效能
將 lFlags 參數設定為允許以列舉值傳回資料,以在傳遞時捨棄 WMI 中的每個專案。 如需詳細資訊,請參閱 呼叫方法。
下列 C++ 程式碼範例示範如何使用 WBEM_FLAG_RETURN_IMMEDIATE 和 WBEM_FLAG_FORWARD_ONLY 旗標。
WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY
在 VBScript 或 Visual Basic 中,使用來自 WbemFlagEnum 的腳本旗標 WbemFlagReturnImmediately和WbemFlagForwardOnly。 這些旗標的合併值是十進位 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。