Kinerja counter nilai mungkin tiba-tiba melompat ke depan

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 274323 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

GEJALA

Hasil yang dikembalikan oleh QueryPerformanceCounter fungsi mungkin tiba-tiba melompat ke depan dari waktu ke waktu. Lompatan ini mungkin mewakili beberapa detik.

PENYEBAB

Masalah ini terjadi sebagai hasil dari cacat desain interconnect perifer komponen (PCI) untuk industri standar arsitektur (ISA) jembatan dari beberapa chipset. Jembatan ini sering disebut sebagai Jembatan Selatan. Lompat terjadi di bawah beban bus PCI berat, ketika sistem operasi menerima serangkaian hasil yang tak terduga dari jembatan. Sistem operasi mendeteksi hasil yang tak terduga dan menghitung jumlah untuk menambahkan ke performa counter. Hal ini menyebabkan hasil kembali dari QueryPerformanceCounter untuk melompat ke depan.

PEMECAHAN MASALAH

Program harus menonton untuk melompat yang tak terduga dengan membandingkan perubahan dalam waktu seperti yang ditentukan oleh berturut-turut panggilan untuk QueryPerformanceCounter dengan perubahan dalam waktu seperti yang ditentukan oleh berturut-turut panggilan untuk GetTickCount fungsi. Jika ada lompatan signifikan yang didasarkan pada QueryPerformanceCounter(), tetapi tidak ada peningkatan serupa yang didasarkan pada GetTickCount, maka dapat diasumsikan bahwa performa counter hanya melompat ke depan. Contoh kode pada akhir artikel ini menunjukkan bagaimana untuk melakukan hal ini.

STATUS

Sistem operasi ini adalah aktivitas. Kinerja counter penyesuaian diperlukan ketika sistem operasi memperoleh data tidak dapat diandalkan dari chipset.

INFORMASI LEBIH LANJUT

Desain cacat dalam sebuah perangkat keras chip dikenal sebagai ralat. Cacat desain ini dapat menyebabkan produk untuk menyimpang dari spesifikasi. Untuk informasi mengenai ralat di chipset tertentu, hubungi vendor perangkat keras untuk chipset.

Sebuah mesin PCI komponen diidentifikasi oleh PCI pengenal dalam kunci berikut di registri Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
Nama subkunci mempunyai bentuk berikut
VEN_xxxx& DEV_YYYY& SUBSYS_aaaaa& REV_BB
di mana xxxx:YYYY mewakili PCI pengenal.

Saat ini, chip dengan pengidentifikasi PCI berikut diketahui menunjukkan sebuah lompatan dalam kinerja counter nilai:
Perkecil tabel iniPerbesar tabel ini
PCI IDVendor perangkat keras
1039:0530Silikon terintegrasi sistem (SiS)
1039:0620Silikon terintegrasi sistem (SiS)
10B9:0533Acer Labs, Inc. (ALi)
10B9:1533Acer Labs, Inc. (ALi)
1106:0596VIA Technologies, Inc (melalui)
1106:0686VIA Technologies, Inc (melalui)
1166:004FServerWorks Corporation
1166:0050ServerWorks Corporation
8086:7110Intel Corporation
Daftar ini akan diperbarui sebagai Microsoft mengamati perilaku dalam chipset lainnya.

Contoh kode

Dalam kode contoh berikut menunjukkan metode yang dijelaskan di atas untuk mendeteksi kinerja counter lompatan. Jika kode yang berjalan pada komputer dengan PIIX4 chipset, misalnya, aplikasi konsol ini secara sporadis akan melaporkan lompatan dalam nilai counter kinerja.
#include <windows.h>
#include <stdio.h>

void main() {

   LARGE_INTEGER liFrequency;
   LARGE_INTEGER liCurrent;
   LARGE_INTEGER liLast;
   LARGE_INTEGER liRecent[10];
   DWORD dwCurrent;
   DWORD dwLast;
   DWORD dwPerfElapsed;
   DWORD dwTickElapsed;
   int i = 0;
   int j;

   // Save the performance counter frequency for later use.
   if (!QueryPerformanceFrequency(&liFrequency))
      printf("QPF() failed with error %d\n", GetLastError());

   // Query the performance counter value and tick count.
   dwCurrent = GetTickCount();
   if (!QueryPerformanceCounter(&liCurrent))
      printf("QPC() failed with error %d\n", GetLastError());

   liLast = liCurrent;
   dwLast = dwCurrent;

   while (TRUE) {

      // Query the performance counter value and tick count.
      if (!QueryPerformanceCounter(&liCurrent))
         printf("QPC() failed with error %d\n", GetLastError());
      dwCurrent = GetTickCount();

      // Store the performance counter value in the list of recent values.
      liRecent[i].QuadPart = liCurrent.QuadPart;
      i = (i+1) % 10;

      // Convert difference in performance counter values to milliseconds.
      dwPerfElapsed = (DWORD) (((liCurrent.QuadPart - liLast.QuadPart) 
            * 1000) / liFrequency.QuadPart);
      
      dwTickElapsed = dwCurrent - dwLast;

      // Check for a discrepancy greater than 500 milliseconds.
      if (abs(dwPerfElapsed - dwTickElapsed) > 500) { 

         // Print the previous 9 performance-counter values.
         for (j=9; j>0; j--) {
            printf("      Previous %d:  %I64X\n", j, liRecent[i].QuadPart);
            i = (i+1) % 10;
         }

         // Print the leap value.
         printf( "LEAP: Current:     %I64X  delta = %I64X\n", 
               liCurrent.QuadPart, liCurrent.QuadPart - liLast.QuadPart);
         
         // Retrieve and print the next 9 performance-counter values.
         for (j=1; j<=9; j++) {
            
            QueryPerformanceCounter(&liCurrent);
            printf("      Next     %d:  %I64X\n", j, liCurrent.QuadPart);
            
            liRecent[i].QuadPart = liCurrent.QuadPart;
            i = (i+1) % 10;
         }

         printf("\n");
      }

      liLast = liCurrent;
      dwLast = dwCurrent;
   }

   return;
}

Properti

ID Artikel: 274323 - Kajian Terakhir: 22 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Win32 Application Programming Interface
Kata kunci: 
kbapi kbkernbase kbperfmon kbprb kbmt KB274323 KbMtid
Penerjemahan 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:274323
Sanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com