2012-02-03 17 views

risposta

9

Sì, c'è: ho eseguito un rapido esperimento e sembra che la versione della stringa sia circa 3 volte più lenta.

string a = "quickbrownfoxjumpsoverthelazydog"; 
    DateTime t1 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace('o', 'b'); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime t2 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace("o", "b"); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime te = DateTime.Now; 
    Console.WriteLine("{0} {1}", t2-t1, te-t2); 

1.466s vs 4.583s

questo non è sorprendente, perché il sovraccarico con le stringhe ha bisogno di un ciclo in più per passare attraverso tutti i caratteri del oldString. Questo ciclo si esegue esattamente una volta, ma il sovraccarico è ancora lì.

+0

grazie per il vostro programma di test! – Laguna

+1

+1 Fuori interesse, c'è qualcuno in grado di decodificare i sovraccarichi di System.String.ReplaceInternal? Sono interessato a vedere se il Dev ha osservato l'immutabilità sul sovraccarico di carbone :) – StuartLC

5

Vorrei string.Replace(char, char) potenzialmente più veloce, in quanto può allocare esattamente la giusta quantità di spazio. Dubito che farà comunque una significativa differenza di prestazioni in molte app del mondo reale.

Ancora più importante, direi che è più leggibile: è più chiaro che ci si ritroverà con una stringa della stessa lunghezza.

3

String.Replace(char, char) è più veloce. La ragione è semplice:

  • sostituzione Char non ha bisogno di allocare una stringa con una dimensione diversa, la sostituzione String ha bisogno di scoprire la nuova dimensione prima o utilizzare un StringBuilder per la sostituzione
  • sostituzione Char non lo fa bisogno di fare un controllo con un intervallo di una stringa. Immagina di avere una stringa come ABCACABCAC e di sostituire ABC. Devi scoprire se 3 caratteri corrispondono, quando lavori con i caratteri devi solo trovare un carattere.