Bagikan melalui


Meningkatkan Performa Enumerasi

Enumerasi cenderung menggunakan sejumlah besar sumber daya sistem. Oleh karena itu, Anda harus mencoba mengoptimalkan proses enumerasi WMI jika Anda berencana untuk melakukan enumerasi pada grup besar. Skrip juga dapat menggunakan kueri untuk menghindari penurunan performa dalam operasi "Untuk masing-masing....Berikutnya" dengan set 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 selengkapnya, 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:

    • WBEM_FLAG_RETURN_IMMEDIATE atau wbemFlagReturnImmediately menandai permintaan 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 balik. Artinya, WMI dapat merilis objek setelah Anda melihat objek .

    Dalam situasi di mana enumerasi besar dan aplikasi sangat cepat, menggunakan enumerator maju-saja dengan pemrosesan semisinkron memungkinkan WMI untuk memegang objek yang jauh lebih sedikit, sehingga meningkatkan waktu respons dan performa memori secara signifikan.

    Contoh kode VBScript berikut menunjukkan cara melakukan panggilan menggunakan bendera wbemFlagReturnImmediately dan wbemFlagForwardOnly gabungan untuk mendapatkan kumpulan 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.

    Karena beberapa penyedia tidak memiliki kemampuan kueri, WMI menyediakan fitur "filter posting" yang memungkinkan WMI membuang instans yang tidak memenuhi spesifikasi kueri. Apakah penyedia tertentu 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 klausa WHERE dari formulir Prop1 < "x". Sebaliknya, WMI biasanya memproses kueri dari formulir KeyProp1 = "x" secara efisien.

Untuk informasi selengkapnya, lihat Menghitung WMI.