Ao testar o código para identificar afunilamentos de desempenho, você precisará usar o timer de resolução mais alta oferecido pelo sistema. Este artigo passo a passo descreve como usar a função
QueryPerformanceCounter para temporizar o código do aplicativo.
OBSERVAÇÃO: JScript .NET não pode chamar as funções API do Microsoft Windows.
Criar e executar um aplicativo de demonstração
- Inicie o Visual Studio .NET e crie um novo aplicativo de console do Visual C#.
- Substitua o código padrão pelo seguinte código, que temporiza as operações em incrementos de 100:
using System;
using System.Runtime.InteropServices;
namespace csConPerfCounter
{
class Class1
{
[DllImport("kernel32.dll")]
extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
extern static short QueryPerformanceFrequency(ref long x);
static void Main(string[] args)
{
long ctr1 = 0, ctr2 = 0, freq = 0;
int acc = 0, i = 0;
if (QueryPerformanceCounter(ref ctr1)!=0) // Begin timing.
{
for (i=0; i<100; i++) acc++; // Code being timed.
QueryPerformanceCounter(ref ctr2); // Finish timing.
Console.WriteLine("Start Value: " + ctr1);
Console.WriteLine("End Value: " + ctr2);
QueryPerformanceFrequency(ref freq);
Console.WriteLine("QueryPerformanceCounter minimum resolution: 1/" + freq + " seconds.");
Console.WriteLine("100 Increment time: " + (ctr2 - ctr1) * 1.0 / freq + " seconds.");
}
else
Console.WriteLine("High-resolution counter not supported.");
// Make the console window wait.
Console.WriteLine();
Console.Write("Press Enter to finish ... ");
Console.Read();
}
}
} - Salve o aplicativo e pressione a tecla F5 para compilar e executar o aplicativo. As janelas de console devem exibir uma saída similar à seguinte:
Start Value: 281060816204
End Value: 281060816269
QueryPerformanceCounter minimum resolution: 1/3579545 seconds.
100 Increment time: 1.81587324646009E-05 seconds.
Press Enter to finish ...
- Pressione ENTER para interromper a execução do aplicativo e fechar a janela do console.
Solução de problemas
- Esta chamada API pode apresentar falhas em algumas circunstâncias. Verifique o valor de retorno e ajuste o código para certificar-se de que você recebeu resultados válidos.
- Para obter melhores resultados, teste o aplicativo várias vezes quando nenhum outro processo de aplicativo ou servidor estiver em execução. As atividades em outros segmentos e processos podem afetar o percentual de tempo que o sistema despenderá no aplicativo de destino.
REFERÊNCIAS
Para obter mais informações, procure por "QueryPerformanceCounter" e "QueryPerformanceFrequency" na Ajuda on-line.
Para obter mais informações sobre outros timers, procure por "timeGetTime", "GetTickCount" e "System.DateTime class" na Ajuda on-line.