Valor de contador de desempenho poderá inesperadamente leap frente

Traduções de Artigos Traduções de Artigos
Artigo: 274323 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

O resultado devolvido pela função QueryPerformanceCounter poderá inesperadamente leap frente de vez em quando. Este bissexto pode representar vários segundos.

Causa

Este problema ocorre devido a um erro de estrutura in a peripheral component interconnect (PCI) para bridge ISA (Industry Standard Architecture) de alguns chipsets. Nesta ponte é normalmente referida como bridge Sul . A ligação ocorre numa carga de barramento PCI elevada, quando o sistema operativo recebe um conjunto de resultados inesperados da bridge de. O sistema operativo detecta os resultados inesperados e calcula um valor para adicionar o contador de desempenho. Isto faz com que o resultado devolvido de QueryPerformanceCounter para passar para a frente.

Resolução

Programas devem procure um salto inesperado, comparando a alteração de tempo, determinado pelas chamadas sucessivas para QueryPerformanceCounter com a alteração no tempo, determinado pelas chamadas sucessivas para a função ObterContagemMarcaEscala . Se existir um salto significativo que se baseia ( QueryPerformanceCounter ), mas não aumentar semelhante que se baseia ObterContagemMarcaEscala , pode ser assumido que o contador de desempenho apenas passou para a frente. O exemplo de código no fim deste artigo demonstra como efectuar este procedimento.

Ponto Da Situação

Comportamento este sistema operativo ocorre por predefinição. O ajuste do contador de desempenho é necessário quando o sistema operativo obtém dados não fiáveis do chipset.

Mais Informação

Defeitos de estrutura de um chip de hardware são conhecidos como errata. Estes defeitos de estrutura podem causar o produto se desviam da especificações publicadas. Para obter informações sobre errata da chipsets específicos, contacte o fabricante do hardware para o chipset.

PCI componentes uma máquina são identificados por um identificador PCI na seguinte chave no registo do Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
Os nomes das subchaves têm o seguinte formato
VEN_ xxxx & DEV_ aaaa & SUBSYS_ aaaaaaaa & REV_bb
em que xxxx : aaaa representa o identificador PCI.

Actualmente, são conhecidos chips com os seguintes identificadores PCI para apresentar uma hiperligação no valor de contador de desempenho:
Reduzir esta tabelaExpandir esta tabela
ID DE PCIFornecedor de hardware
1039:0530Silicon integrado Systems (SiS)
1039:0620Silicon integrado 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
Esta lista será actualizada como Microsoft observa o comportamento de outros chipsets.

Código de exemplo

O código de exemplo seguinte demonstra o método descrito acima para detectar leaps de contador de desempenho. Se o código for executado num computador com o chipset PIIX4, por exemplo, esta aplicação de consola esporadicamente relatório leaps no valor de contador de desempenho.
#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;
}

Propriedades

Artigo: 274323 - Última revisão: 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface
Palavras-chave: 
kbmt kbapi kbkernbase kbperfmon kbprb KB274323 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 274323
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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