Mam trochę kodu, który wykonuje wiele porównań z 64-bitowymi liczbami całkowitymi, jednak musi uwzględniać długość liczby, tak jakby była sformatowana jako ciąg znaków. Nie mogę zmienić kodu wywołującego, tylko funkcję.Najszybszy sposób obliczania długości dziesiętnej liczby całkowitej? (.NET)
Najprostszym sposobem (oprócz .ToString.() Długość) jest:
(int)Math.Truncate(Math.Log10(x)) + 1;
jednak, że wykonuje raczej słabo. Ponieważ moja aplikacja wysyła tylko wartości dodatnie, a odcinki są dość równomiernie rozłożone pomiędzy 2 i 9 (z pewną tendencją do 9), ja precomputed wartości i mieć if:
static int getLen(long x) {
if (x < 1000000) {
if (x < 100) return 2;
if (x < 1000) return 3;
if (x < 10000) return 4;
if (x < 100000) return 5;
return 6;
} else {
if (x < 10000000) return 7;
if (x < 100000000) return 8;
if (x < 1000000000) return 9;
return (int)Math.Truncate(Math.Log10(x)) + 1; // Very uncommon
}
}
Dzięki temu długość być obliczone z średnio 4 porównuje.
Czy są zatem inne sztuczki, których mogę użyć, aby funkcja ta działała szybciej?
Edytuj: Będzie działać jako kod 32-bitowy (Silverlight).
Aktualizacja:
Wziąłem sugestię Normana i zmienił IFS się trochę skutkować średnio tylko 3 porównuje. Zgodnie z komentarzem Seana usunąłem Math.Truncate. Razem zwiększyło to rzeczy o 10%. Dzięki!
Podejrzewam, że jest zbliżona do optymalnej. Będę zainteresowany otrzymaniem jakichkolwiek odpowiedzi ;-p –
Możesz nieco uprościć zwrot, aby uzyskać "powrót 1 + (int) Math.Log10 (x)" Wierzę, –
Och, racja, dziękuję Sean. – MichaelGG