Meningkatkan Performa Enumerasi

Enumerasi cenderung menggunakan sejumlah besar sumber daya sistem. Oleh karena itu, Anda harus mencoba mengoptimalkan proses enumerasi WMI jika Anda berencana melakukan enumerasi pada grup besar. Skrip juga dapat menggunakan kueri untuk menghindari penurunan kinerja dalam operasi "For each….Next" dengan kumpulan data besar. Untuk informasi selengkapnya, lihat Mengkueri WMI.

Prosedur berikut menjelaskan cara meningkatkan performa enumerasi.

Untuk meningkatkan performa enumerasi

  1. Atur parameter lFlags untuk memungkinkan pengembalian semisinkron data dengan enumerator yang membuang setiap item dari WMI saat dikirimkan. Untuk informasi lebih lanjut, lihat Memanggil Metode.

    Contoh kode C++ berikut menunjukkan cara menggunakan bendera WBEM_FLAG_RETURN_IMMEDIATE dan WBEM_FLAG_FORWARD_ONLY.

    WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY

    Di VBScript atau Visual Basic, gunakan bendera skrip WbemFlagReturnImmediately dan WbemFlagForwardOnly dari WbemFlagEnum. Nilai gabungan dari bendera ini adalah desimal 48.

    Bendera skrip dan parameter menyebabkan perilaku berikut:

    • Penanda WBEM_FLAG_RETURN_IMMEDIATE atau wbemFlagReturnImmediately meminta perilaku semisinkron. Panggilan untuk membuat enumerator segera kembali. Anda kemudian dapat mulai melintasi kumpulan objek yang Anda terima.
    • Bendera WBEM_FLAG_FORWARD_ONLY atau bendera wbemFlagForwardOnly meminta enumerator yang tidak dapat Anda putar kembali. Artinya, WMI dapat merilis objek setelah Anda melihatnya.

    Dalam situasi di mana jumlah enumerasi yang besar dan aplikasi sangat cepat, menggunakan enumerator maju-satu-arah dengan pemrosesan semisinkron memungkinkan WMI untuk mengurangi penyimpanan objek secara signifikan, sehingga meningkatkan waktu respons dan performa memori.

    Contoh kode VBScript berikut menunjukkan cara melakukan panggilan menggunakan flag gabungan wbemFlagReturnImmediately dan wbemFlagForwardOnly untuk mendapatkan koleksi peristiwa dari log peristiwa.

    Set Events = GetObject("winmgmts:").ExecQuery _
         ("SELECT * FROM Win32_NTLogEvent " _
          & "WHERE Logfile = 'System'",,48)
    
  2. Jika memungkinkan, hindari menggunakan CreateInstanceEnum di C++ atau SWbemServices.InstancesOf, dan sebagai gantinya gunakan ExecQuery.

    Metode ExecQuery meminta WMI menggunakan teknologi database, sementara CreateInstanceEnum atau SWbemServices.InstancesOf menghitung objek WMI. Secara khusus, ExecQuery dapat meminta subset data tertentu yang tidak dapat dijumlahkan oleh metode enumerasi.

    Karena beberapa penyedia tidak memiliki kemampuan kueri, WMI menyediakan fitur "penyaringan pasca" yang memungkinkan WMI mengabaikan instans yang tidak memenuhi spesifikasi kueri. Apakah penyedia tertentu yang memanfaatkan fitur ini terserah pembuat penyedia.

  3. Bereksperimenlah dengan kueri yang berbeda untuk menentukan apa yang memberi Anda performa terbaik.

    Misalnya, WMI jarang memproses kueri secara efisien dengan WHERE klausa formulir Prop1 < "x". Sebaliknya, WMI biasanya memproses kueri formulir KeyProp1 = "x" secara efisien.

Untuk informasi selengkapnya, lihat Menghitung WMI.