Pergunta

Enquanto a pergunta verifique se a entrada é do tipo string foi encerrado, duas das respostas geraram uma questão de micro-otimização em minha mente:qual das duas soluções abaixo teria melhor desempenho?

Reed Copsey forneceu um solução usando Char.IsLetter:

string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );

Adaptado solução usando regex de Marcos Byers:

string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);

Não querendo apenas fazer a pergunta a Reed ou Mark, pensei em escrever um teste rápido para determinar qual teve melhor desempenho.O problema é que não fiz muita otimização de código (costumo colocar a legibilidade do código acima de tudo).

Além de obter um carimbo de data/hora antes e depois da execução de cada um, quais são algumas outras opções (melhores?) Para determinar qual solução é executada mais rapidamente?

Editar

eu modifiquei A resposta de Martinho trabalhar com Console.WriteLine(...) e executei-o como um aplicativo de console.Não tenho certeza exatamente como LinqPad executa aplicativos, mas os resultados foram praticamente os mesmos:

41
178
Foi útil?

Solução

Você vai querer fazer isso medindo os tempos de execução usando um Cronômetro.Além disso, aqui estão algumas coisas muito importantes que você deve ter em mente ao criar um perfil:

  1. Sempre execute seu teste mais de uma vez.Na primeira vez que você executá-lo, haverá sobrecarga do JIT e os tempos poderão ser enganosos.Executar muitas vezes e calcular a média é uma boa abordagem (geralmente executarei um teste como este 100.000 vezes, por exemplo).
  2. Sempre execute seu teste com um build de versão completo, fora do processo de hospedagem do Visual Studio.(Por padrão, você pode usar Ctrl+F5 para isso.) O host do Visual Studio afeta drasticamente os tempos.

Outras dicas

você deveria conferir System.Diagnostics.Stopwatch!

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Você deve executar a coisa muitas vezes em loop para reduzir erros de tempo e outros fatores incontroláveis.

Espero que ajude.

Acabei de juntar isso LINQPad como um exemplo de como eu faria isso (daí as chamadas para Dump() - Substitua por Console.WriteLine(...) se você não estiver usando esta ferramenta útil).

Parece que o método LINQ é um pouco mais de quatro vezes mais rápido:

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string myString = "RandomStringOfLetters";
 bool allLetters = myString.All( c => Char.IsLetter(c) );
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

stopwatch.Reset();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string s = "RandomStringOfLetters";
 bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

Saída:

47 
196

Existe uma classe System.Diagnostics.Stopwatch que pode ser usada.

Seja qual for o código que você testar, execute o teste uma vez para remover os custos JIT e, em seguida, execute-o novamente para os tempos finais.A maioria das contagens de tempo individuais pode não ser representativa devido a outros fatores no PC - portanto, execute muitas iterações e calcule o tempo de execução médio a partir delas.

Use a classe System.Diagnostics.Stopwatch.

Inicie o StopWatch e execute vários milhares de iterações, pare-o e verifique o total de milissegundos decorridos

Etapas para determinar qual é mais rápido: -

  1. Obtenha uma coleção de computadores, algumas centenas devem bastar, AMD/Intel/outros, 32 bits/64 bits, ...

  2. Instale cada estrutura .NET de seu interesse em cada um deles (por sua vez)

  3. Experimente cada combinação de opções de otimização para compilação (por sua vez)

  4. Use o StopWatch para testar uma grande corrida para cada

  5. Monitore a utilização da memória para cada um, pois isso pode ter um impacto maior no restante do seu aplicativo.Economizar alguns ciclos ao custo de maior consumo de memória e mais atividades de coleta de lixo costuma ser uma 'otimização' ruim.

Que poder dar uma ideia sobre o que é mais rápido na prática, pelo menos para as versões atuais do compilador.Repita com cada nova versão do compilador.

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