Valor de contador de rendimiento inesperadamente puede leap hacia delante

Seleccione idioma Seleccione idioma
Id. de artículo: 274323 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

El resultado devuelto por la función QueryPerformanceCounter puede inesperadamente bisiestos hacia delante de vez en cuando. Este bisiesto puede representar varios segundos.

Causa

Este problema se produce como consecuencia de un defecto de diseño en la interconexión de componentes periféricos (PCI) a puente ISA (Industry Standard Architecture) de algunos conjuntos de chips. Este puente se conoce normalmente como puente sur . El salto se produce bajo una pesada carga de bus PCI, cuando el sistema operativo recibe una serie de resultados inesperados del puente de. El sistema operativo detecta los resultados inesperados y calcula un importe para agregar el contador de rendimiento. Esto hace que el resultado devuelto desde QueryPerformanceCounter para avanzar.

Solución

Programas deben vigilar que un salto inesperado comparando el cambio en el tiempo según las llamadas sucesivas a QueryPerformanceCounter con el cambio en el tiempo según las llamadas sucesivas a la función GetTickCount . Si hay un salto importante que se basa en () de QueryPerformanceCounter , pero no aumentar similar que se basa GetTickCount , puede se asume que el contador de rendimiento sólo saltar hacia delante. El ejemplo de código al final de este artículo muestra cómo hacerlo.

Estado

Comportamiento de este sistema operativo es por diseño. El ajuste de contador de rendimiento es necesario cuando el sistema operativo obtiene datos no confiables del conjunto de chips.

Más información

Defectos de diseño dentro de un chip de hardware se conocen como erratas. Estos defectos de diseño pueden provocar que el producto para desviarse de especificaciones publicadas. Para obtener información sobre erratas en conjuntos de chips específico, póngase en contacto con el fabricante del hardware para el conjunto de chips.

Componentes de un equipo PCI se identifican por un identificador PCI dentro de la siguiente clave del registro de Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
Los nombres de subclaves tienen el formato siguiente
VEN_ xxxx & DEV_ aaaa & SUBSYS_ aaaaaaaa & REV_bb
donde xxxx : aaaa representa el identificador PCI.

Actualmente, chips con los siguientes identificadores PCI se sabe que presentan un salto en el valor del contador de rendimiento:
Contraer esta tablaAmpliar esta tabla
ID DE PCIProveedor de hardware
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
Se actualizará esta lista Microsoft respeta el comportamiento de otros conjuntos de chips.

Código de ejemplo

En el siguiente ejemplo de código muestra el método descrito anteriormente para detectar los avances de contador de rendimiento. Si el código se ejecuta en un equipo con el conjunto de chips de conjunto de chips PIIX4, por ejemplo, esta aplicación de consola esporádicamente informará avances en el valor de contador de rendimiento.
#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;
}

Propiedades

Id. de artículo: 274323 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface
Palabras clave: 
kbmt kbapi kbkernbase kbperfmon kbprb KB274323 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 274323
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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