共用方式為


改善列舉效能

列舉通常會使用大量的系統資源。 因此,如果您打算在大型群組上執行列舉,您應該嘗試優化 WMI 列舉程式。 腳本程式也可以通過使用查詢來避免在大型集合中的「For each...Next」作業中出現效能降低的情況。 如需詳細資訊,請參閱 查詢 WMI

下列程序說明如何改善列舉效能。

改善列舉效能

  1. 設定 lFlags 參數,以允許使用列舉值半同步地傳回數據,並在接收數據時由列舉器捨棄 WMI 中的每個專案。 如需詳細資訊,請參閱 呼叫 方法

    下列C++程序代碼範例示範如何使用 WBEM_FLAG_RETURN_IMMEDIATEWBEM_FLAG_FORWARD_ONLY 旗標。

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    在 VBScript 或 Visual Basic 中,使用 WbemFlagReturnImmediatelyWbemFlagForwardOnlyWbemFlagEnum。 這些旗標的合併值為十進位 48。

    腳本和參數旗標會導致下列行為:

    • WBEM_FLAG_RETURN_IMMEDIATEwbemFlagReturnImmediately 旗標要求半同步行為。 要建立枚舉器的呼叫會立即傳回。 然後,您可以開始遍歷收到的物件集。
    • WBEM_FLAG_FORWARD_ONLY 旗標或 wbemFlagForwardOnly 旗標會要求一個無法倒回的列舉器。 也就是說,在您檢視對象之後,WMI 可以釋放物件。

    在列舉項目數量龐大且應用程式執行速度非常快的情況下,使用具有半同步處理功能的僅正向列舉子,能讓WMI保留更少的物件,從而顯著改善回應時間和記憶體效能。

    下列 VBScript 程式代碼範例示範如何使用結合的 wbemFlagReturnImmediatelywbemFlagForwardOnly 旗標進行呼叫,以從事件記錄檔取得事件集合。

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. 盡可能避免在 C++ 或 SWbemServices.InstancesOf中使用 CreateInstanceEnum,請改用 ExecQuery

    ExecQuery 方法會使用資料庫技術查詢 WMI,而 CreateInstanceEnumSWbemServices.InstancesOf 列舉 WMI 物件。 具體來說,ExecQuery 可以要求列舉方法無法的特定數據子集。

    由於某些提供者沒有查詢功能,因此 WMI 提供「後置篩選」功能,可讓 WMI 捨棄不符合查詢規格的實例。 特定提供者是否利用這項功能,由提供者作者決定。

  3. 試驗不同的查詢,以判斷哪一個能為您提供最佳效能。

    例如,WMI 很少有效率地處理具有格式 Prop1 < “x” 之 WHERE 子句的查詢。 相反地,WMI 通常會有效率地處理 KeyProp1 = “x” 格式的查詢。

如需詳細資訊,請參閱 列舉 WMI