Domanda

Mentre la domanda Controllare se l'input è tipo di stringa È stato chiuso Due delle risposte a spillo una domanda di micro-ottimizzazione nella mia mente: quale delle seguenti due soluzioni funzionerebbe meglio?

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
.

È stato utile?

Soluzione

Vuoi farlo, misurando i runtimes usando un Cronometro .Inoltre, ecco alcune cose molto importanti da tenere a mente quando la profilazione:

    .
  1. 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.)
  2. 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: -

    .
  1. Ottieni una raccolta di computer, un paio di cento dovrebbe fare, AMD / Intel / Altro, 32 bit / 64 bit, ...

  2. Installa ogni framework .NET che ti interessa su ciascuno di essi (a turno)

  3. Prova ogni combinazione di opzioni di ottimizzazione per la compilazione (a turno)

  4. Utilizzare il cronometro per testare una grande corsa per ogni

  5. 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'.

  6. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top