效能計數器值可能會意外地向前迅捷

文章翻譯 文章翻譯
文章編號: 274323 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

QueryPerformanceCounter 函式所傳回的結果可能會意外地迅捷向前的時候。這個閏可能代表幾秒鐘。

發生的原因

到某些晶片組的工業標準架構 (ISA) 橋接器週邊元件連接 (PCI) 中的設計缺失的結果就會發生這個問題。這個橋接器通常稱為 南橋接器。跳躍點發生於沈重的 PCI 匯流排負荷下操作系統從橋接器取得一連串的非預期的結果時。作業系統會偵測到未預期的結果並計算要新增至效能計數器的金額。這會傳回的結果導致從 QueryPerformanceCounter 向前跳。

解決方案

程式必須留意的未預期的跳躍藉由比較中由連續呼叫來 QueryPerformanceCounter 時間 GetTickCount 函式的後續呼叫所決定的變更所決定的時間變更。如果根據 QueryPerformanceCounter (),但不根據 GetTickCount 的類似增加的重大跳躍然後它可以會假設仍然效能計數器只跳轉。在本文結尾處的程式碼範例示範如何執行這項操作。

狀況說明

此作業系統的行為是經過設計規劃的。當作業系統會從晶片組取得不可靠的資料時,效能計數器調整是必要的。

其他相關資訊

硬體晶片中的設計缺失即為 「 錯誤 」。這些設計缺失可能會造成與已發佈的規格不符合該產品。如特定晶片組的錯誤有關請連絡硬體廠商,如晶片組。

在 Windows 登錄中下列機碼內是 PCI 識別項來識別機器的 PCI 元件:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
子機碼名稱有下列的表單
VEN_ xxxx DEV_ (& I)yyyy SUBSYS_ (& I)aaaaaaaa REV_ (& I)bb
其中 xxxxyyyy 代表 PCI 識別項。

目前,下列 PCI 識別項的晶片已知展示區效能計數器值中的跳躍點:
摺疊此表格展開此表格
PCI 識別碼硬體廠商
1039:0530矽整合系統 (SiS)
1039:0620矽整合系統 (SiS)
10b9:0533acer 實驗室,Inc.(ALi)
10b9:1533acer 實驗室,Inc.(ALi)
1106:0596VIA 技術,Inc.(VIA)
1106:0686VIA 技術,Inc.(VIA)
1166:004fServerworks 股份有限公司
1166:0050Serverworks 股份有限公司
8086:7110Intel 股份有限公司
如同 Microsoft 會遵守中其他的晶片組行為,就會更新此清單。

範例程式碼

下列範例程式碼會示範來偵測效能計數器 leaps 上面所述的方法。如果有 PIIX4 晶片組的電腦上執行程式碼,例如這個主控台應用程式會偶發性報告 leaps 在效能計數器值。
#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;
}

屬性

文章編號: 274323 - 上次校閱: 2006年11月21日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface
關鍵字:?
kbmt kbapi kbkernbase kbperfmon kbprb KB274323 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:274323
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

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