Come testare quale implementazione del metodo funziona più velocemente
-
26-09-2020 - |
Domanda
Reed Copsey fornito a Soluzione utilizzando Char.IsLetter
:
string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );
.
Adattato soluzione usando regex da Mark Byers :
string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
.
Non volendo semplicemente fare la domanda di o reed o mark ho pensato che avrei scritto un test rapido per determinare quale è stato migliore. Il problema è che non ho fatto un sacco di ottimizzazione del codice (tendo a mettere la leggibilità del codice sopra ogni altra cosa).
Oltre a prendere un timestamp prima e dopo la corsa di ciascuno, quali sono alcune altre (migliori?) Opzioni di determinare quale soluzione viene eseguita più veloce?
Modifica
I Modificato La risposta di Martin per lavorare con Console.WriteLine(...)
e correva come un'applicazione console. Non sono sicuro esattamente come linqpad esegue applicazioni ma i risultati erano circa lo stesso:
41 178.
Soluzione
Vuoi farlo, misurando i runtimes usando un Cronometro .Inoltre, ecco alcune cose molto importanti da tenere a mente quando la profilazione:
- .
- Esegui sempre il test più di 1 volta.La prima volta che lo esegui, ci sarà il sovraccarico dal jit, e i tempi potrebbero essere fuorvianti.Running molte volte e prendere la media è un buon approccio (eseguirò spesso un test come questa 100.000 volte, per esempio.)
- Esegui sempre il test con una bobina completa, al di fuori del processo di hosting di Visual Studio.(Per impostazione predefinita, è possibile utilizzare Ctrl + F5 per questo.) L'host Visual Studio influisce drasticamente i tempi.
Altri suggerimenti
Dovresti controllare System.Diagnostics.Stopwatch
!
.http://msdn.microsoft.com/en-UR / Library / System.Diagnostics.StopWatch.aspx
Dovresti eseguire la cosa molte volte in un anello per ridurre gli errori di temporizzazione e altri fattori incontrollabili.
Spero che ti aiuti.
Ho appena messo questo insieme in linqpad come esempio di come lo farei (da qui ilchiama a Dump () - Sostituisci con console.Writeline (...) Se non stai usando questo strumento pratico).
Sembra che il modo Linq sia leggermente più di quattro volte più veloce:
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();
.
Uscita:
47
196
. C'è una classe System.Diagnostics.StopWatch che può essere utilizzata.
Qualunque sia il codice di testo, eseguire il test una volta per rimuovere i costi JIT e quindi eseguirlo di nuovo per i tempi finali.La maggior parte dei conteggi di temporizzazione individuale potrebbe essere non rappresentative a causa di altri fattori sul PC - quindi eseguire molte iterazioni e quindi calcolare il runtime medio da quello.
Utilizzare la classe System.Diagnostics.StopWatch.
Avvia il cronometro e esegui diverse migliaia di iterazioni, fermarlo e controllare i millisecondi totali che sono trascorsi
Passi per determinare quale è più veloce: -
- .
-
Ottieni una raccolta di computer, un paio di cento dovrebbe fare, AMD / Intel / Altro, 32 bit / 64 bit, ...
-
Installa ogni framework .NET che ti interessa su ciascuno di essi (a turno)
-
Prova ogni combinazione di opzioni di ottimizzazione per la compilazione (a turno)
-
Utilizzare il cronometro per testare una grande corsa per ogni
-
Monitorare l'utilizzo della memoria per ciascuno in quanto può avere un impatto più ampio sul resto dell'applicazione.Salvare alcuni cicli al costo di un aumento del consumo di memoria e più attività di raccolta della spazzatura è spesso una povera 'ottimizzazione'.
che potrebbe darti un'idea di cui è più veloce nella pratica, almeno per le release attuali del compilatore.Ripeti con ogni nuova versione del compilatore.