改善列舉效能

列舉通常會使用大量的系統資源。 因此,如果您打算在大型群組上執行列舉,您應該嘗試優化 WMI 列舉程式。 腳本也可以使用查詢來避免「針對每個...下一個」作業具有大型集合的效能降低。 如需詳細資訊,請參閱 查詢 WMI

下列程式描述如何改善列舉效能。

改善列舉效能

  1. lFlags 參數設定為允許以列舉值傳回資料,以在傳遞時捨棄 WMI 中的每個專案。 如需詳細資訊,請參閱 呼叫方法

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

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    在 VBScript 或 Visual Basic 中,使用來自 WbemFlagEnum 的腳本旗標 WbemFlagReturnImmediatelyWbemFlagForwardOnly 這些旗標的合併值是十進位 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