ID Artikel: 172338 - Kajian Terakhir: 16 September 2011 - Revisi: 2.0

Cara menggunakan QueryPerformanceCounter untuk waktu kode

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Ketika waktu kode untuk mengidentifikasi bottleneck kinerja, Anda ingin menggunakan resolusi tertinggi timer sistem yang ditawarkan. Artikel ini menjelaskan cara menggunakan fungsi QueryPerformanceCounter waktu aplikasi kode.

INFORMASI LEBIH LANJUT

Beberapa timer berbeda akurasi yang ditawarkan oleh sistem operasi:
Function                 Units                      Resolution
---------------------------------------------------------------------------
Now, Time, Timer         seconds                    1 second
GetTickCount             milliseconds               approx. 10 ms
TimeGetTime              milliseconds               approx. 10 ms
QueryPerformanceCounter  QueryPerformanceFrequency  same
				
Jika sistem Anda mendukung counter resolusi tinggi, Anda dapat menggunakan QueryPerformanceCounter dan QueryPerformanceFrequency untuk melakukan resolusi tinggi Timing.

Dalam kode contoh berikut membandingkan berbagai Counter:

PERINGATAN: PENGGUNAAN OLEH ANDA DARI KODE YANG TERSEDIA DI DALAM ARTIKEL INI ADALAH ANDA SENDIRI RISIKO. Microsoft menyediakan kode ini "sebagaimana adanya" tanpa garansi apapun, baik tersurat maupun tersirat, termasuk namun tidak terbatas pada tersirat jaminan dapat diperjualbelikan dan/atau kesesuaian untuk tujuan tertentu.

Langkah demi langkah prosedur

  1. Masukkan kode berikut ke dalam modul. Jika Anda masuk ke dalam kelas, bentuk, atau laporan modul, membuat deklarasi swasta.
           Option Explicit
    
          Declare Function QueryPerformanceCounter Lib "Kernel32" _
                                     (X As Currency) As Boolean
          Declare Function QueryPerformanceFrequency Lib "Kernel32" _
                                     (X As Currency) As Boolean
          Declare Function GetTickCount Lib "Kernel32" () As Long
          Declare Function timeGetTime Lib "winmm.dll" () As Long
    
          Sub Test_Timers()
          Dim Ctr1 As Currency, Ctr2 As Currency, Freq As Currency
          Dim Count1 As Long, Count2 As Long, Loops As Long
          '
          ' Time QueryPerformanceCounter
          '
            If QueryPerformanceCounter(Ctr1) Then
              QueryPerformanceCounter Ctr2
              Debug.Print "Start Value: "; Format$(Ctr1, "0.0000")
              Debug.Print "End Value: "; Format$(Ctr2, "0.0000")
              QueryPerformanceFrequency Freq
              Debug.Print "QueryPerformanceCounter minimum resolution: 1/" & _
                          Freq * 10000; " sec"
              Debug.Print "API Overhead: "; (Ctr2 - Ctr1) / Freq; "seconds"
            Else
              Debug.Print "High-resolution counter not supported."
            End If
          '
          ' Time GetTickCount
          '
            Debug.Print
            Loops = 0
            Count1 = GetTickCount()
            Do
              Count2 = GetTickCount()
              Loops = Loops + 1
            Loop Until Count1 <> Count2
            Debug.Print "GetTickCount minimum resolution: "; _
                        (Count2 - Count1); "ms"
            Debug.Print "Took"; Loops; "loops"
          '
          ' Time timeGetTime
          '
            Debug.Print
            Loops = 0
            Count1 = timeGetTime()
            Do
              Count2 = timeGetTime()
              Loops = Loops + 1
            Loop Until Count1 <> Count2
            Debug.Print "timeGetTime minimum resolution: "; _
                        (Count2 - Count1); "ms"
            Debug.Print "Took"; Loops; "loops"
          End Sub
    						
  2. Menjalankan fungsi dari jendela Debug/segera. Keluaran Anda harus tampak mirip dengan berikut ini:
    Mulai nilai: 3516284.3498
    Mengakhiri nilai: 3516284.3521
    QueryPerformanceCounter resolusi minimum: 1/1193182 sec
    API Overhead: 1.92761875388667E-05 detik

    GetTickCount resolusi minimum: 10 ms
    Mengambil loop 650

    timeGetTime resolusi minimum: 10 ms
    Mengambil loop 1565
Beberapa pernyataan mengeksekusi sebelum GetTickCount atau timeGetTime merekam perubahan. Jumlah sebenarnya loop akan bervariasi tergantung pada latar belakang tugas sistem operasi mengeksekusi.

Di sisi lain, QueryPerformanceCounter perubahan nilai antara berturut-turut API panggilan, menunjukkan manfaatnya dalam waktu resolusi tinggi. The resolusi dalam hal pada rangka dari satu mikrodetik. Karena resolusi bergantung pada sistem, ada tidak ada standar unit itu langkah-langkah. Anda harus membagi perbedaan oleh QueryPerformanceFrequency untuk menentukan jumlah detik berlalu. Dalam kasus di atas, overhead untuk hanya memanggil API adalah sekitar 19 microseconds. Ini harus dikurangi ketika waktu lain kode sebagai berikut:
   Private Sub Time_Addition()
   Dim Ctr1 As Currency, Ctr2 As Currency, Freq As Currency
   Dim Overhead As Currency, A As Long, I As Long
     QueryPerformanceFrequency Freq
     QueryPerformanceCounter Ctr1
     QueryPerformanceCounter Ctr2
     Overhead = Ctr2 - Ctr1        ' determine API overhead
     QueryPerformanceCounter Ctr1  ' time loop
     For I = 1 To 100
       A = A + I
     Next I
     QueryPerformanceCounter Ctr2
     Debug.Print "("; Ctr1; "-"; Ctr2; "-"; Overhead; ") /"; Freq
     Debug.Print "100 additions took";
     Debug.Print (Ctr2 - Ctr1 - Overhead) / Freq; "seconds"
   End Sub
				
Contoh output:
(3630876.6256-3630876.6388-0.0013) / 119.3182
tambahan 100 mengambil 9.97333181358753E-05 detik
Catatan: Karena mata uang variabel yang digunakan, nilai-nilai kembali adalah 10000 kali lebih kecil daripada Counter sebenarnya. Karena perhitungan detik melibatkan divisi operasi, faktor ini dibatalkan.

REFERENSI

Jaringan Pengembang Microsoft; topik: timeGetTime GetTickCount QueryPerformanceCounter QueryPerformanceFrequency

Berlaku bagi:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Control Creation Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Word 2002
  • Microsoft Word 2000
  • Microsoft Word 97 Standard Edition
Kata kunci: 
kbhowto kbprogramming kbmt KB172338 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:172338  (http://support.microsoft.com/kb/172338/en-us/ )