Makale numarası: 172338 - Son Gözden Geçirme: 20 Ocak 2007 Cumartesi - Gözden geçirme: 3.3

Saat Kodu'na QueryPerformanceCounter nasıl kullanılır?

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Performans sorunları tanımlamak için kod zamanlama, sistem sunmak için olan en yüksek çözünürlük süreölçeri kullanmak istediğiniz. Bu makalede, zaman uygulama kodu QueryPerformanceCounter işlevine kullanmayı açıklamaktadır.

Daha fazla bilgi

Işletim sistemi tarafından sunulan ve farklı doğruluğu, birçok süreölçerleri:
Function                 Units                      Resolution
---------------------------------------------------------------------------
Now, Time, Timer         seconds                    1 second
GetTickCount             milliseconds               approx. 10 ms
TimeGetTime              milliseconds               approx. 10 ms
QueryPerformanceCounter  QueryPerformanceFrequency  same
				
sisteminiz yüksek çözünürlüklü bir sayacı destekler, QueryPerformanceCounter ve QueryPerformanceFrequency yüksek çözünürlüklü zamanlamaları yapmak için kullanabilirsiniz.

Aşağıdaki örnek kod, çeşitli sayaçlarını karşılaştırılmaktadır:

UYARI: TÜM, BU MAKALEDE SAĞLANAN KOD TARAFINDAN KENDİ SORUMLULUà ° UNUZDADýR KULLANILIR. Microsoft, hiçbir garanti, ya da veya zımni, dahil ancak bunlarla sınırlı olmamak satılabilirlik ve/veya belirli bir amaca uygunluk zımni hiçbir garanti olmadan "olduğu gibi", bu kodu sağlar.

Adım adım yordamlar

  1. Aşağıdaki kod, modül girin. Bir sınıf, form veya rapor modülüne girin, bildirimlerinde özel olun.
           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. Işlev Debug/hemen penceresinden çalıştırın. Çıkışınız aşağıdakine benzer görünmelidir:
    Değer'nı başlatın: 3516284.3498
    Değer son: 3516284.3521
    En düşük çözünürlüğü QueryPerformanceCounter: 1 1193182/sn
    API genel gider: 1.92761875388667E - 05 saniye

    GetTickCount en düşük çözünürlük: 10 ms
    650 Döngüleri sürdü

    en düşük çözünürlüğü timeGetTime: 10 ms
    1565 Döngüleri sürdü
GetTickCount veya timeGetTime kayıt önce bir değişiklik, birden çok ifadeleri yürütün. Döngü sayısı, işletim sistemi yürütülürken Arka plan görevlerini bağlı olarak değişir.

Diğer yandan, QueryPerformanceCounter yüksek çözünürlüklü bir zamanlama'da, kullanışlılığı belirten, birbirini izleyen API çağrıları arasında bir değer de değişir. Çözüm, bu durumda bir microsecond sırasını olur. Çözünürlük sistemi bağımlı olduğu için onu ölçer hiçbir standart birimleri vardır. Farkı saniye cinsinden geçen belirlemek için QueryPerformanceFrequency bölmek vardır. Yukarıdaki durumda, yalnızca APı'ı çağırmak için yükü hakkında 19 mikrosaniye olarak ' dir. Bu diğer kodlar gibi zamanlama sırasında çıkarılması gerekir:
   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
				
çıkış örnek:
(3630876.6256-3630876.6388-0.0013) / 119.3182
100 eklemeleri 9.97333181358753E sürdü - 05 saniye
Not: kullanılan para birimi değişkenleri için döndürülen gerçek sayacı 10000 bir kez daha küçük değerlerdir. Süre hesaplaması için bir bölme işlemi hattınızda, bu faktörü iptal.

Referanslar

Microsoft Developer Network'e; konuları: timeGetTime GetTickCount QueryPerformanceCounter QueryPerformanceFrequency

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.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 Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
Anahtar Kelimeler: 
kbmt kbhowto kbprogramming KB172338 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:172338  (http://support.microsoft.com/kb/172338/en-us/ )