Pergunta

Eu gostaria de fazer alguns perfis básicos do meu código, mas descobriu que o DateTime.Now em C # só tem uma resolução de cerca de 16 ms. Deve haver momento melhor manter construções que eu ainda não encontraram.

Foi útil?

Solução

Aqui está um pouco amostra de código para tempo de uma operação:

Dim sw As New Stopwatch()
sw.Start()
//Insert Code To Time
sw.Stop()
Dim ms As Long = sw.ElapsedMilliseconds
Console.WriteLine("Total Seconds Elapsed: " & ms / 1000)

EDIT:

E o mais interessante é que ele pode retomar também.

Stopwatch sw = new Stopwatch();
foreach(MyStuff stuff in _listOfMyStuff)
{
    sw.Start();
    stuff.DoCoolCalculation();
    sw.Stop();
}
Console.WriteLine("Total calculation time: {0}", sw.Elapsed);

O System.Diagnostics.Stopwatch classe vontade usar um contador de alta resolução se estiver disponível em seu sistema.

Outras dicas

A classe System.Diagnostics.Stopwatch é impressionante para profiling.

Aqui está um link para Código Temporizador Blog Vance Morrison , se você não quer escrever suas próprias funções de medição.

Para contadores mais elevados de desempenho resolução que você pode usar os contadores de desempenho win32 subjacentes.

Adicione o seguinte P / Invoke sigs:

[System.Runtime.InteropServices.DllImport("Kernel32.dll")]
public static extern bool QueryPerformanceCounter(out long perfcount);

[System.Runtime.InteropServices.DllImport("Kernel32.dll")]
public static extern bool QueryPerformanceFrequency(out long freq);

E chamá-los usando:

#region Query Performance Counter
/// <summary>
/// Gets the current 'Ticks' on the performance counter
/// </summary>
/// <returns>Long indicating the number of ticks on the performance counter</returns>
public static long QueryPerformanceCounter()
{
    long perfcount;
    QueryPerformanceCounter(out perfcount);
    return perfcount;
}
#endregion

#region Query Performance Frequency
/// <summary>
/// Gets the number of performance counter ticks that occur every second
/// </summary>
/// <returns>The number of performance counter ticks that occur every second</returns>
public static long QueryPerformanceFrequency()
{
    long freq;
    QueryPerformanceFrequency(out freq);
    return freq;
}
#endregion

Despejar tudo em uma classe simples e você está pronto para ir. Exemplo (assumindo um nome de classe de PerformanceCounters):

long startCount = PerformanceCounter.QueryPerformanceCounter();
// DoStuff();
long stopCount = PerformanceCounter.QueryPerformanceCounter();
long elapsedCount = stopCount - startCount;
double elapsedSeconds = (double)elapsedCount / PerformanceCounter.QueryPerformanceFrequency();
MessageBox.Show(String.Format("Took {0} Seconds", Math.Round(elapsedSeconds, 6).ToString()));

Você poderia ligar para o contador de desempenho de alta resolução no Windows. O nome da função é QueryPerformanceCounter no kernel32.dll.

A sintaxe para importar para C #:

[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

A sintaxe para a chamada do Windows:

BOOL QueryPerformanceCounter(      
    LARGE_INTEGER *lpPerformanceCount
);

QueryPerformanceCounter @ MSDN

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top