ho notato decimal.Parse(number, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture)
è di circa il 100% più lento di metodo parse decimale personalizzato basato sul codice di Jeffrey Sax da Faster alternative to Convert.ToDoubleveloce alternativa al decimal.Parse
public static decimal ParseDecimal(string input) {
bool negative = false;
long n = 0;
int len = input.Length;
int decimalPosition = len;
if (len != 0) {
int start = 0;
if (input[0] == '-') {
negative = true;
start = 1;
}
for (int k = start; k < len; k++) {
char c = input[k];
if (c == '.') {
decimalPosition = k +1;
} else {
n = (n *10) +(int)(c -'0');
}
}
}
return new decimal(((int)n), ((int)(n >> 32)), 0, negative, (byte)(len -decimalPosition));
}
Suppongo che è perché nativo decimal.Parse
è stato organizzato per lottare con stile di numero e informazioni sulla cultura.
Tuttavia, il metodo sopra menzionato non utilizza il terzo parametro hi byte in new decimal
, quindi non funzionerà con numeri più grandi.
Esiste un'alternativa più veloce a decimal.Parse
per convertire stringhe costituite solo da numeri e punti decimali in decimale che funzionerebbero con numeri grandi?
EDIT: Benchmark:
var style = System.Globalization.NumberStyles.AllowDecimalPoint;
var culture = System.Globalization.CultureInfo.InvariantCulture;
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
s.Reset();
s.Start();
for (int i=0; i<10000000; i++)
{
decimal.Parse("20000.0011223344556", style, culture);
}
s.Stop();
Console.WriteLine(s.Elapsed.ToString());
s.Reset();
s.Start();
for (int i=0; i<10000000; i++)
{
ParseDecimal("20000.0011223344556");
}
s.Stop();
Console.WriteLine(s.Elapsed.ToString());
uscita:
00:00:04.2313728
00:00:01.4464048
personalizzato ParseDecimal è in questo caso molto più velocemente rispetto decimal.Parse.
I numeri negativi devono ancora essere considerati? –
WillemVanOnsem Van Onsem, nel mio caso di utilizzo corrente non ho bisogno di numeri negativi. Tuttavia, questa è una domanda generale che potrebbe essere utile a chiunque, quindi sarebbe meglio se supportasse numeri negativi. – LukAss741
Decimal.Parse() è veloce quanto deve essere, scritto in C++ e integrato nel sistema operativo negli ultimi 20 anni. Puoi solo accelerarlo tagliando gli angoli. Non sei abbastanza esplicito su quale tipo di bug trovi accettabile. –