Sdílet prostřednictvím


Zlepšení výkonu výčtu

Výčty mají tendenci používat značné množství systémových prostředků. Proto byste se měli pokusit optimalizovat proces výčtu WMI, pokud plánujete provádět výčty ve velké skupině. Skripty mohou také použít dotaz, aby se předešlo zhoršení výkonu operací "Pro každý...Další" s velkou sadou. Další informace najdete v tématu Dotazování rozhraní WMI.

Následující postup popisuje, jak zlepšit výkon výčtu.

Zlepšení výkonu výčtu

  1. Nastavte parametr lFlags tak, aby umožňoval polosynchronní vrácení dat pomocí enumerátoru, který zahodí každou položku ze služby WMI při doručení. Další informace naleznete v tématu Volání metody.

    Následující příklad kódu jazyka C++ ukazuje, jak používat příznaky WBEM_FLAG_RETURN_IMMEDIATE a WBEM_FLAG_FORWARD_ONLY.

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    V jazyce VBScript nebo Visual Basic použijte skriptovací příznaky WbemFlagReturnImmediately a WbemFlagForwardOnly z WbemFlagEnum. Kombinovaná hodnota těchto příznaků je desítková 48.

    Skriptování a příznaky parametrů způsobují následující chování:

    • WBEM_FLAG_RETURN_IMMEDIATE nebo wbemFlagReturnImmediately příznak požaduje polosynchronní režim. Volání k vytvoření enumerátoru se vrátí okamžitě. Pak můžete začít procházet sadu objektů, kterou obdržíte.
    • Příznak WBEM_FLAG_FORWARD_ONLY nebo wbemFlagForwardOnly vyžaduje enumerátor, který nelze vrátit zpět. To znamená, že WMI může uvolnit objekt po zobrazení objektu.

    V situacích, kdy je výčet velký a aplikace je velmi rychlá, použití enumerátorů jen pro předávání s polosynchronním zpracováním umožňuje službě WMI držet mnohem méně objektů, což výrazně zvyšuje dobu odezvy a výkon paměti.

    Následující příklad kódu VBScript ukazuje, jak provést volání pomocí kombinovaných příznaků wbemFlagReturnImmediately a wbemFlagForwardOnly k tomu, abychom získali kolekci událostí z protokolu událostí.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Pokud je to možné, nepoužívejte CreateInstanceEnum v jazyce C++ nebo SWbemServices.InstancesOfa místo toho použijte ExecQuery.

    Metoda ExecQuery dotazuje rozhraní WMI pomocí databázových technologií, zatímco CreateInstanceEnum nebo SWbemServices.InstancesOf enumeruje objekty WMI. Konkrétně ExecQuery může požadovat konkrétní podmnožinu dat, které metody výčtu nemohou.

    Vzhledem k tomu, že někteří poskytovatelé nemají možnosti dotazování, poskytuje rozhraní WMI funkci post filter, která umožňuje rozhraní WMI zahodit instance, které nesplňují specifikace dotazu. Zda konkrétní poskytovatel využívá tuto funkci, je na autorovi poskytovatele.

  3. Experimentujte s různými dotazy a zjistěte, co vám dává nejlepší výkon.

    Například rozhraní WMI zřídka zpracovává dotazy pomocí klauzulí WHERE formuláře Prop1 < "x". Naproti tomu rozhraní WMI obvykle zpracovává dotazy formuláře KeyProp1 = "x" efektivně.

Další informace naleznete v Enumerování WMI.