Valor do contador de desempenho inesperadamente pode saltar frente

Traduções deste artigo Traduções deste artigo
ID do artigo: 274323 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

O resultado é retornado pela função QueryPerformanceCounter pode inesperadamente salto avanço de tempos em tempos. Este bissexto pode representar vários segundos.

Causa

Esse problema ocorre como resultado de um defeito de design na interconexão de componentes periféricos (PCI) à ponte ISA (Industry Standard Architecture) de alguns chipsets. Essa ponte é normalmente chamada ponte Sul . O salto ocorre sob uma carga pesada de barramento PCI, quando o sistema operacional recebe uma série de resultados inesperados da ponte. O sistema operacional detecta os resultados inesperados e calcula um valor para adicionar o contador de desempenho. Isso faz com que o resultado retornado de QueryPerformanceCounter para ir adiante.

Resolução

Programas devem observar para um salto inesperado comparando a alteração no tempo conforme determinado pelo sucessivas chamadas a QueryPerformanceCounter com a alteração no tempo conforme determinado pelo sucessivas chamadas a função ObterContagemMarcaEscala . Se há um salto significativo que se baseia em QueryPerformanceCounter (), mas há aumento semelhante que baseia-se no ObterContagemMarcaEscala , em seguida, ele pode ser considerado que o contador de desempenho apenas entrou frente. O exemplo de código no final deste artigo demonstra como fazer isso.

Situação

Comportamento do sistema operacional é por design. O ajuste de contador de desempenho é necessário quando o sistema operacional obtém dados não confiáveis de conjunto de chips.

Mais Informações

Defeitos de design dentro de um chip de hardware são conhecidos como erratas. Esses defeitos de design podem causar o produto desviar de especificações de publicado. Para obter informações sobre erratas em chipsets específicos, contate o fornecedor do hardware para o chipset.

Componentes PCI do computador são identificados por um identificador PCI dentro na seguinte chave no registro do Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
Os nomes de subchaves têm o seguinte formulário
VEN_ xxxx & DEV_ aaaa & SUBSYS_ aaaaaaaa & REV_bb
onde xxxx : aaaa representa o identificador de PCI.

Atualmente, chips com os seguintes identificadores PCI são conhecidas por apresentar um salto no valor do contador de desempenho:
Recolher esta tabelaExpandir esta tabela
ID DE PCIFornecedor 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
Essa lista será atualizada como Microsoft observa o comportamento de outros chipsets.

Código de exemplo

O código de exemplo a seguir demonstra o método descrito acima para detectar leaps de contador de desempenho. Se o código é executado em um computador com o conjunto de chips PIIX4, por exemplo, este aplicativo de console esporadicamente reportará 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

ID do artigo: 274323 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32
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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 274323
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

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