Pergunta

Eu sou um novato total, mas eu estava escrevendo um pequeno programa que trabalhou em cordas em C # e percebi que se eu fiz algumas coisas de forma diferente, o código executado significativamente mais rápido.

Por isso, me perguntando, como é que você vai cronometrar a velocidade de execução do seu código? Há algum (gratuito) serviços públicos? Você vai fazer sobre isso da maneira old-fashioned com um System.Timer e fazê-lo sozinho?

Foi útil?

Solução

O que você está descrevendo é conhecido como perfil de desempenho. Existem muitos programas que você pode começar a fazer isso, como JetBrains profiler ou Formigas profiler , embora a maioria vai abrandar o seu aplicativo, enquanto no processo de medição de seu desempenho

Para a mão-roll seu próprio perfil de desempenho, você pode usar System.Diagnostics.Stopwatch e uma Console.WriteLine simples, como você descreveu.

Além disso, mantenha em mente que o compilador C # JIT optimiza código, dependendo do tipo e frequência é chamado, então brincar com loops de diferentes tamanhos e métodos tais como chamadas recursivas para ter uma idéia do que funciona melhor.

Outras dicas

ANTS Profiler de RedGate é um muito bom profiler desempenho. dotTrace Profiler da JetBrains também é grande. Estas ferramentas vão permitir que você veja as métricas de desempenho que podem ser perfurados para baixo a cada linha individual.

Scree tiro de ANTS Profiler: ANTS http://www.red-gate.com/products/ ants_profiler / images / app / timeline_calltree3.gif

Se você quiser garantir que um método específico estadias dentro de um limite de desempenho específicos durante o teste de unidade, gostaria de usar o classe Stopwatch para monitorar o tempo de execução de um método de uma ou muitas vezes em um loop e calcular a média e, em seguida, Assert contra o resultado.

Apenas um lembrete - certifique-se de compilar Release, não Debug! (Eu vi esse erro cometido por programadores experientes - é fácil esquecer).

O que você está descrevendo é 'Performance Tuning'. Quando falamos de ajuste de desempenho há dois ângulo para ele. (A) O tempo de resposta - quanto tempo é preciso para executar um determinado pedido / programa. (B) Taxa de transferência - Quantas solicitações que podem ser executadas em um segundo. Quando tipicamente 'optimizar' - quando eliminar processamento desnecessário, tanto o tempo de resposta, assim como o rendimento melhora. No entanto, se você tem eventos de espera em seu código (como Thread.sleep (), I / O esperar etc) o seu tempo de resposta é afetada no entanto rendimento não é afetado. Através da adopção de processamento em paralelo (dando origem a vários segmentos) que pode melhorar o tempo de resposta, mas não o rendimento será melhorado. Tipicamente para aplicação do lado do servidor, tanto o tempo de resposta e o rendimento são importantes. Para aplicativos de desktop (como IDE) produção não só é importante o tempo de resposta é importante.

Você pode medir o tempo de resposta de 'Teste de Desempenho' - que anotou o tempo de resposta para todas as transações-chave. Você pode medir a taxa de transferência por 'Load Testing' - Você precisa bombear solicitações continuamente desde suficientemente grande número de threads / clientes de modo que o uso da CPU de computador do servidor é de 80-90%. Quando bombear pedido precisamos para manter a relação entre as diferentes transações (chamado mix transação) - por exemplo: em um sistema de reservas haverá 10 de reserva para cada 100 pesquisa. haverá um cancelamento para cada 10 reserva etc.

Depois de identificar as transações exigem ajuste para (teste de desempenho) tempo de resposta você pode identificar os pontos quentes usando um profiler. Você pode identificar os pontos quentes para transferência através da comparação da fração * tempo de resposta da transação. Suponha em busca, reserva, cenário de cancelamento, a relação é de 89: 10: 1. O tempo de resposta são de 0,1 seg, 10 seg e 15 seg. carregar para pesquisa - 0,1 * 0,89 = 0,089 carregar para reserva- 10 * 0,1 = 1 carga para CanCell = 15 * 0,01 = 0,15 Aqui ajuste de reserva vai render o máximo impacto sobre o rendimento. Você também pode identificar os pontos quentes para o rendimento, tendo lixeiras de rosca (no caso de aplicações baseadas em Java) repetidamente.

Use um profiler.

Se você só precisa de um método específico para o tempo, a classe Cronômetro pode ser uma boa escolha.

I fazer as seguintes coisas: 1) eu uso carrapatos (por exemplo em VB.Net Now.ticks) para a medição do tempo actual. I subtrair os carrapatos Partindo do valor carrapatos terminado e dividir por TimeSpan.TicksPerSecond para obter quantos segundos que levou. 2) I evitar operações de interface do usuário (como Console.WriteLine). 3) executar o código ao longo de um ciclo substancial (como 100.000 iterações) para fator de fora variáveis ??de uso / OS da melhor forma que puder.

Você pode usar a classe StopWatch aos métodos de tempo. Lembre-se da primeira vez que é muitas vezes lento devido ao código de ter que ser JITted.

Há uma opção de .NET nativa (Team Edition for Software Developers) que pode resolver algumas necessidades de análise de desempenho. A partir do menu 2005 .NET IDE, selecione Ferramentas-> Desempenho Ferramentas-> Assistente de desempenho ...

[GSS é provavelmente correto que você deve ter Team Edition]

Este é um exemplo simples para testar a velocidade de código. Espero ter ajudado você

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top