Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wyliczenia zwykle używają znacznej ilości zasobów systemowych. W związku z tym należy spróbować zoptymalizować proces wyliczania WMI, jeśli planujesz wykonywanie wyliczeń w dużej grupie. Skrypty mogą również używać zapytania, aby uniknąć obniżenia wydajności operacji "Dla każdego....Dalej" z dużym zestawem. Aby uzyskać więcej informacji, zobacz Querying WMI.
W poniższej procedurze opisano sposób poprawiania wydajności wyliczania.
Aby zwiększyć wydajność wyliczania
Ustaw parametr lFlags, aby umożliwić semisynchroniczne zwracanie danych za pomocą enumeratora, który odrzuca każdy element z WMI w miarę jego dostarczania. Więcej informacji znajdziesz w Wywoływanie metody.
Poniższy przykład kodu C++ pokazuje, jak używać flag WBEM_FLAG_RETURN_IMMEDIATE i WBEM_FLAG_FORWARD_ONLY.
WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLYW języku VBScript lub Visual Basic użyj flag skryptów WbemFlagReturnImmediately i WbemFlagForwardOnly z WbemFlagEnum. Łączna wartość tych flag to liczba dziesiętna 48.
Flagi skryptów i parametrów powodują następujące zachowanie:
- Flaga WBEM_FLAG_RETURN_IMMEDIATE lub wbemFlagReturnImmediately żąda zachowania semisynchronicznego. Wywołanie w celu utworzenia modułu wyliczającego zwraca natychmiast. Następnie możesz rozpocząć przechodzenie przez otrzymany zestaw obiektów.
- Flaga WBEM_FLAG_FORWARD_ONLY lub wbemFlagForwardOnly flaga żąda modułu wyliczającego, którego nie można przewijać. Oznacza to, że usługa WMI może zwolnić obiekt po jego wyświetleniu.
W sytuacjach, gdy wyliczenie jest duże, a aplikacja jest bardzo szybka, przy użyciu modułów wyliczających tylko do przodu z przetwarzaniem półsynchronicznym usługa WMI może trzymać się znacznie mniejszej liczby obiektów, co znacznie zwiększa czas odpowiedzi i wydajność pamięci.
Poniższy przykład kodu VBScript pokazuje, jak wykonać wywołanie, używając połączonych flag wbemFlagReturnImmediately i wbemFlagForwardOnly, aby uzyskać kolekcję zdarzeń z dziennika zdarzeń.
Set Events = GetObject("winmgmts:").ExecQuery _ ("SELECT * FROM Win32_NTLogEvent " _ & "WHERE Logfile = 'System'",,48)Jeśli to możliwe, unikaj używania CreateInstanceEnum w języku C++ lub SWbemServices.InstancesOf, a zamiast tego użyj ExecQuery.
Metoda ExecQuery wysyła zapytanie do usługi WMI przy użyciu technologii bazy danych, podczas gdy createInstanceEnum lub SWbemServices.InstancesOf wylicza obiekty WMI. W szczególności ExecQuery może zażądać określonych podzbiorów danych, których nie mogą wykonywać metody wyliczania.
Ponieważ niektórzy dostawcy nie mają możliwości wykonywania zapytań, usługa WMI posiada funkcję "filtr końcowy", która umożliwia WMI odrzucenie obiektów, które nie spełniają specyfikacji zapytania. To, czy dany dostawca korzysta z tej funkcji, zależy od autora dostawcy.
Poeksperymentuj z różnymi zapytaniami, aby określić, co daje najlepszą wydajność.
Na przykład usługa WMI rzadko przetwarza zapytania za pomocą WHERE klauzul formularza Prop1 < "x". Natomiast usługa WMI zwykle przetwarza zapytania formularza KeyProp1 = "x" wydajnie.
Aby uzyskać więcej informacji, zapoznaj się z Wyliczanie WMI.