È stato rilevato qualche vantaggi prestazionali di uno rispetto ad un altro tra Convert.ChangeType o Convert.ToInt32 o int.ParseQuali sono le principali differenze tra Convert.ChangeType o Convert.ToInt32?
risposta
Se sai che stai andando ad essere la conversione di un string
-Int32
, utilizzando Convert.ChangeType
sembra un modo di fare oscura quella. Sicuramente preferirei le altre chiamate a questo.
La differenza principale tra int.Parse
e Convert.ToInt32(x)
è che Convert.ToInt32(null)
restituisce 0 dove, come int.Parse(null)
sarà un'eccezione. Naturalmente, int.Parse
ti dà anche più controllo in termini di quale cultura viene utilizzata.
dubito molto che non c'è alcun beneficio delle prestazioni di uno sopra l'altro: vorrei aspetterebbeConvert.ToInt32
per chiamare int.Parse
, piuttosto che il contrario - ma non è documentato a lavorare in questo modo, e il colpo di è improbabile che una singola chiamata al metodo sia significativa. (Potrebbe essere comunque in linea.)
Sia Convert.ToInt32() che Int32.Parse() utilizzano il metodo (non disponibile al pubblico) System.Number.ParseInt32() che a sua volta richiama System.Number.StringToNumber(). Come faccio a saperlo? Guarda la traccia dello stack di FormatException che viene generata quando si passa una stringa non valida :-) –
@ user532870: Giusto abbastanza - ma non mi farei mai affidamento su quel genere di cose :) –
@ user532870: Jon ha ragione. reflection indica che Convert.ToInt32 chiama int.Parse che chiama Number.ParseInt32. @ Jon: Quindi int.Parse è migliore? – naveen
Sì.
Convert.ToInt32 è meglio che utilizzare Convert.ChangeType per lo stesso scopo.
ChangeType è un metodo di conversione generico che converte l'oggetto specificato dal valore in conversionType. Mentre ToInt32 è specifico per il tipo int32.
Infatti, 'ChangeType()' è programmatico 'cast', nel frattempo' Convert.ToInt32() 'crea veramente' int' da altro tipo – abatishchev
private const int maxValue = 1000000;
static void Main(string[] args)
{
string[] strArray = new string[maxValue];
for (int i = 0; i < maxValue; i++)
{
strArray[i] = i.ToString();
}
int[] parsedNums = new int[maxValue];
CalcChangeTypePerf(strArray,parsedNums);
CalcToInt32Perf(strArray, parsedNums);
CalcIntParse(strArray, parsedNums);
}
public static void CalcChangeTypePerf(string[] strArray,int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = (int)Convert.ChangeType(strArray[i], typeof(int));
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcChangeTypePerf", stopwatch.ElapsedMilliseconds);
}
public static void CalcToInt32Perf(string[] strArray, int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = Convert.ToInt32(strArray[i]);
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcToInt32Perf", stopwatch.ElapsedMilliseconds);
}
public static void CalcIntParse(string[] strArray, int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = int.Parse(strArray[i]);
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcIntParse", stopwatch.ElapsedMilliseconds);
}
Questo semplice i risultati dei test questa
266 on CalcChangeTypePerf
167 on CalcToInt32Perf
165 on CalcIntParse
Stai creando un milione di oggetti in ogni prova, inutilmente. Mentre ogni test è "uguale" in questo modo, significa che le differenze relative nell'effettivo * tempo di parsing * sono mascherate, e potrebbe esserci una garbage collection all'interno di un test, ripulendo i rifiuti da un altro. Ti suggerisco di creare una serie di stringhe * una volta * all'inizio e riutilizzarla. –
Risolto Jon, hai ragione, i tempi sono davvero diversi ... –
prova semplice mostra Parse()
è metodo più veloce, la prossima Convert.ToInt32()
e ultima Convert.ChangeType()
:
static void Main(string[] args)
{
string s = "104563";
int a = 1;
for (int k = 0; k < 4; k++)
{
Stopwatch w = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = (int)Convert.ChangeType(s, typeof(int));
w.Stop();
Console.WriteLine("ChangeType={0}", w.ElapsedMilliseconds);
Stopwatch w1 = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = Convert.ToInt32(s);
w1.Stop();
Console.WriteLine("ToInt32={0}", w1.ElapsedMilliseconds);
Stopwatch w2 = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = Int32.Parse(s);
w2.Stop();
Console.WriteLine("Parse={0}", w2.ElapsedMilliseconds);
}
Console.ReadLine();
}
risultato è:
ChangeType=2422
ToInt32=1859
Parse=1760
ChangeType=2374
ToInt32=1857
Parse=1762
ChangeType=2378
ToInt32=1860
Parse=1763
ChangeType=2375
ToInt32=1855
Parse=1759
- 1. Quali sono/sono le principali differenze tra Flink e Storm?
- 2. Quali sono le principali differenze tra Babel e TypeScript
- 3. quali sono le principali differenze tra tutti i motori mysql?
- 4. Quali sono le principali differenze tra "gc" e "gccgo"?
- 5. quali sono le principali differenze tra fwrite e write?
- 6. Quali sono le principali differenze tra StringTemplate e FreeMarker?
- 7. Quali sono le principali differenze tra Cocoa e CocoaTouch?
- 8. Quali sono le principali differenze tra AngularJS e ReactJS
- 9. Go-Scala-Go! Quali sono le principali differenze?
- 10. Quali sono le differenze tra $ {} e # {}?
- 11. Quali sono le differenze tra MPI e OpenMP?
- 12. Quali sono le differenze tra Tibco EMS e Rendezvous
- 13. Quali sono le differenze tra HTTP 1.0 e 1.1?
- 14. Quali sono le differenze tra Model, ModelMap e ModelAndView?
- 15. quali sono le differenze tra Vundle e NeoBundle?
- 16. Quali sono le differenze di utilizzo tra size_t e off_t?
- 17. Django treebeard quali sono le differenze tra AL, NS, MP
- 18. Quali sono le principali differenze tra i miglioramenti di CoffeeScript e Dart su JavaScript?
- 19. Quali sono le principali differenze tra API Web e ASP MVC
- 20. Quali sono le differenze tra le classi Helper e Utility?
- 21. Quali sono le principali differenze tra Emacs Lisp e Common Lisp?
- 22. Quali sono le differenze chiave tra Meteor, Ember.js e Backbone.js?
- 23. Quali sono le principali differenze tra IE7 e IE8 che uno sviluppatore web dovrebbe conoscere?
- 24. Quali sono/sono le differenze tra MSBuild e TFSBuild
- 25. Quali sono le principali differenze tra MPS e Eclipse Xtext di Jetbrains?
- 26. Quali sono le principali differenze tra funzionalità Github Wiki e Leggimi,
- 27. Quali sono le principali differenze tra gli algoritmi di ricerca Knuth-Morris-Pratt e Boyer-Moore?
- 28. MPI vs GPU vs Hadoop, quali sono le principali differenze tra questi tre parallelismi?
- 29. Quali sono le principali differenze tra HAML, SASS/Compass e ERB?
- 30. Quali sono le principali differenze tra i dialmi mysql e oracle sql?
Non dimenticare di 'Int32.TryParse (String, out int)' che offre alcune buone possibilità. – basti