Valeur du compteur de performance peut leap inattendue avant

Traductions disponibles Traductions disponibles
Numéro d'article: 274323 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Le résultat renvoyé par la fonction QueryPerformanceCounter peut inattendue leap avant de temps à autre. Cette bissextile peut représenter plusieurs secondes.

Cause

Ce problème se produit comme une suite d'un défauts de conception de l'interconnexion de composant périphérique PCI (à pont ISA (Industry Standard Architecture) de certains circuits microprogrammés. Ce pont est couramment appelé le pont Sud . Le renvoi se produit sous une lourde charge bus PCI, lorsque le système d'exploitation est une série des résultats inattendus du pont. Le système d'exploitation détecte les résultats inattendus et calcule un montant à ajouter dans le compteur de performance. Ainsi, le résultat renvoyé de QueryPerformanceCounter pour passer vers l'avant.

Résolution

Programmes doivent regarder en comparant le changement de temps déterminée par les appels à QueryPerformanceCounter avec la modification dans le temps comme déterminé par les appels à met en registre la fonction GetTickCount pour un renvoi inattendu. S'il y a un saut significatif qui repose sur () QueryPerformanceCounter , mais aucune augmentation similaire qui repose sur GetTickCount , puis il peut être supposé que le compteur de performance intervalle uniquement vers l'avant. L'exemple de code à la fin de cet article montre comment procéder.

Statut

Comportement de ce système d'exploitation est par la conception. L'ajustement de compteur de performances est nécessaire lorsque le système d'exploitation obtient les données non fiables à partir du processeur.

Plus d'informations

Défauts de conception dans un microprocesseur sont appelées errata. Ces défauts de conception peuvent provoquer le produit pour modifier de spécifications publiées. Pour d'informations sur errata de circuits microprogrammés spécifiques, veuillez contacter le fournisseur de matériel pour le chipset.

Composants PCI d'un ordinateur sont identifiés par un identificateur PCI dans la clé suivante dans le Registre Windows :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
Les noms des sous-clés que le formulaire suivant
VEN_ xxxx & DEV_ aaaa & SUBSYS_ aaaaaaaa & REV_bb
xxxx : aaaa représente l'identificateur PCI.

Actuellement, puces avec les identificateurs PCI suivants sont connus pour présenter une déviation de valeur du compteur de performance :
Réduire ce tableauAgrandir ce tableau
ID PCIFournisseur de matériel
1039:0530Silicon Integrated Systems (SiS)
1039:0620Silicon Integrated Systems (SiS)
10B9:0533Acer Labs, Inc. (ALi)
10B9:1533Acer Labs, Inc. (ALi)
1106:0596VIA Technologies, Inc. (VIA)
1106:0686VIA Technologies, Inc. (VIA)
1166:004FServerWorks Corporation
1166:0050ServerWorks Corporation
8086:7110Intel Corporation
Cette liste sera mis à jour que Microsoft respecte le comportement dans autres circuits microprogrammés.

Exemple de code

L'exemple de code suivant illustre la méthode décrite ci-dessus pour la détection leaps de compteur de performances. Si le code est exécuté sur un ordinateur avec le chipset PIIX4, par exemple, cette application de console sporadique indiquera leaps dans la valeur de compteur de performances.
#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;
}

Propriétés

Numéro d'article: 274323 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface
Mots-clés : 
kbmt kbapi kbkernbase kbperfmon kbprb KB274323 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 274323
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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