Estou escrevendo um código assim, fazendo um pouco de tempo rápido e sujo:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Certamente há uma maneira de chamar esse código de temporização de lambda do .NET 3.0 sofisticado, em vez de (Deus me livre) recortá-lo e colá-lo algumas vezes e substituí-lo DoStuff(s)
por DoSomethingElse(s)
?
Eu sei que pode ser feito como um, Delegate
mas estou me perguntando sobre o caminho lambda.
Time
se comporta como um método estático, descartando todos os estados existentes emsw
, portanto, apresentá-lo como um método de instância parece enganoso.Stopwatch.StartNew
, o que é estático por uma razão. C # não tem a capacidade de adicionar métodos estáticos às classes existentes (ao contrário do F #), então eu entendo o impulso de fazer isso, mas ainda deixa um gosto ruim na minha boca.Aqui está o que tenho usado:
Uso:
fonte
Console.WriteLine("")
para testes em// do stuff that I want to measure
, o compilador não fica nada satisfeito. Você deveria fazer expressões e declarações normais lá?Você pode tentar escrever um método de extensão para qualquer classe que estiver usando (ou qualquer classe base).
Eu gostaria que a ligação se parecesse com:
Então, o método de extensão:
Qualquer objeto derivado de DependencyObject agora pode chamar TimedFor (..). A função pode ser facilmente ajustada para fornecer valores de retorno por meio de parâmetros ref.
-
Se você não quiser que a funcionalidade seja vinculada a qualquer classe / objeto, você pode fazer algo como:
Então você pode usá-lo como:
Caso contrário, esta resposta parece ter alguma habilidade "genérica" decente:
Envolvendo o tempo de StopWatch com um delegado ou lambda?
fonte
A
StopWatch
classe não precisa estarDisposed
ouStopped
com erro. Portanto, o código mais simples para cronometrar alguma ação éAmostra de código de chamada
Não gosto da ideia de incluir as iterações no
StopWatch
código. Você sempre pode criar outro método ou extensão que controle a execução deN
iterações.Amostra de código de chamada
Aqui estão as versões do método de extensão
E um exemplo de código de chamada
Testei os métodos estáticos e os métodos de extensão (combinando iterações e benchmark) e o delta do tempo de execução esperado e do tempo real de execução é <= 1 ms.
fonte
Eu escrevi uma classe CodeProfiler simples há algum tempo que envolveu o cronômetro para facilmente criar o perfil de um método usando uma ação: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Ele também permitirá facilmente que você crie o perfil do código multithread. O exemplo a seguir criará o perfil da ação lambda com 1-16 threads:
fonte
Supondo que você só precisa de um tempo rápido de uma coisa, isso é fácil de usar.
fonte
Você pode sobrecarregar vários métodos para cobrir vários casos de parâmetros que você pode querer passar para o lambda:
Como alternativa, você pode usar o delegado Func se eles devem retornar um valor. Você também pode passar uma matriz (ou mais) de parâmetros se cada iteração deve usar um valor exclusivo.
fonte
Para mim, a extensão parece um pouco mais intuitiva no int, você não precisa mais instanciar um cronômetro ou se preocupar em redefini-lo.
Então você tem:
Com o uso de amostra de:
Saída de amostra:
fonte
Eu gosto de usar as classes CodeTimer de Vance Morrison (um dos caras performáticos do .NET).
Ele postou em seu blog com o título " Medindo código gerenciado com rapidez e facilidade: CodeTimers ".
Inclui coisas legais como um MultiSampleCodeTimer. Ele faz o cálculo automático da média e do desvio padrão e também é muito fácil de imprimir seus resultados.
fonte
fonte