2010-02-08 19 views
5

sto usando CultureInfo.CurrentCulture quando formattazione mie corde usando string.formatprestazioni considerazione quando si utilizzano le proprietà più volte

Per citare this blog

Questo ha solo l'implicazione che se si utilizza CurrentCulture molto, è potrebbe valer la pena leggerlo in una variabile privata invece di fare molte chiamate a CultureInfo.CurrentCulture, altrimenti stai usando cicli di clock su inutilmente.

così come da questo autore

var culture = CultureInfo.CurrentCulture 
string.Format(culture,"{0} some format string","some args"); 
string.Format(culture,"{0} some format string","some other args"); 

è meglio di

string.Format(CultureInfo.CurrentCulture,"{0} some format string","some args"); 
string.Format(CultureInfo.CurrentCulture,"{0} some format string","some other args"); 

come da MSDN, CultureInfo.CurrentCulture is a property

C'è una penalizzazione delle prestazioni associato quando si accede a una proprietà più volte? ?

Inoltre ho eseguito alcune analisi emperiche e i miei test mi mostrano che l'utilizzo di una variabile locale è più costoso rispetto all'utilizzo diretto della proprietà.

Stopwatch watch = new Stopwatch(); 

      int count = 100000000; 
      watch.Start(); 
      for(int i=0;i<count;i++) 
      { 
       string.Format(CultureInfo.CurrentCulture, "{0} is my name", "ram"); 
      } 


      watch.Stop(); 
       //EDIT:Reset watch 
       watch.Reset(); 


      Console.WriteLine(watch.Elapsed); 
      Console.WriteLine(watch.ElapsedMilliseconds); 
      Console.WriteLine(watch.ElapsedTicks); 


      Console.WriteLine("--------------------"); 
      var culture = CultureInfo.CurrentCulture; 
      watch.Start(); 
      for (int i=0; i < count; i++) 
      { 
       string.Format(culture, "{0} is my name", "ram"); 
      } 


      watch.Stop(); 

      Console.WriteLine(watch.Elapsed); 
      Console.WriteLine(watch.ElapsedMilliseconds); 
      Console.WriteLine(watch.ElapsedTicks); 

Risultato:

00:00:29.6116306 
29611 
68922550970 
-------------------- 
00:00:27.3578116 
27357 
63676674390 

miei test dimostrano che l'uso di CultureInfo.CurrentCulture proprietà è meglio che usare variabile locale (che contraddice con vista degli autori). O mi sto perdendo qualcosa qui?

Modifica: non ho reimpostato il cronometro prima della seconda iterazione. quindi la differenza. azzeramento del cronometro, aggiornamento del conteggio delle iterazioni e risultato in questa modifica

+3

Nel codice di prova non si reimposta il cronometro. L'utilizzo del riferimento memorizzato nella cache è in realtà più veloce. – Steven

+0

CultureInfo.CurrentCulture non è economico, ma string.Format è molto più costoso. – Steven

+0

Steven, hai dannatamente ragione, non stavo azzerando il cronometro. Perché non lo postare come risposta e aggiornerò il mio post + segnalo come risposta. Per quelli che sono curiosi, sì, usare la variabile locale è più veloce. Una differenza di circa 2.473 secondi per 100 milioni di iterazioni !!! – ram

risposta

2

C'è un bug nel codice. Nel tuo codice di test non resetti il ​​cronometro. Quando ripristini il cronometro, vedrai che l'utilizzo del riferimento memorizzato nella cache è più veloce. CultureInfo.CurrentCulture non è economico, ma string.Format è molto più costoso.

3

È necessario ottimizzare CultureInfo.CurrentCulture in una variabile locale solo se un profiler indica che si tratta di un problema significativo nel codice e anche che l'inserimento in una variabile locale lo rende più veloce . Questo profilo mostra che nessuno dei due è vero, quindi non lo inserirò in un locale.

7

L'unico vero motivo per riscrivere il codice per

var culture = CultureInfo.CurrentCulture; 
String.Format(culture, "{0} some format string", "some args"); 
String.Format(culture, "{0} some format string", "some other args"); 

da

String.Format(CultureInfo.CurrentCulture, "{0} some format string", "some args"); 
String.Format(CultureInfo.CurrentCulture, "{0} some format string", "some other args"); 

è per migliorare la leggibilità e la manutenibilità. Ora, se per qualche motivo è necessario modificare la cultura da CultureInfo.CurrentCulture a CultureInfo caricata tramite un file di configurazione o passata come metodo al parametro, è sufficiente modificare il codice in un'unica posizione. Le prestazioni sono una considerazione secondaria qui e probabilmente non importa in quanto questo è altamente improbabile che sia un collo di bottiglia nel codice.

Problemi correlati