Tengo un código que hace muchas comparaciones de enteros de 64 bits, sin embargo, debe tener en cuenta la longitud del número, como si estuviera formateado como una cadena. No puedo cambiar el código de llamada, solo la función.¿La forma más rápida de calcular la longitud decimal de un entero? (.NET)
La forma más fácil (. Además .ToString() Longitud) es:
(int)Math.Truncate(Math.Log10(x)) + 1;
Sin embargo que realiza bastante mal. Desde mi aplicación sólo envía valores positivos, y las longitudes son más bien distribuido uniformemente entre 2 y 9 (con algún sesgo hacia 9), I precalculadas los valores y tener si declaraciones:
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
}
}
Esto permite que la longitud pueden calcular con un promedio de 4 comparaciones.
Entonces, ¿hay otros trucos que pueda usar para hacer que esta función sea más rápida?
Editar: Esto se ejecutará como código de 32 bits (Silverlight).
Actualización:
Me tomó la sugerencia de Norman y cambió los ifs un poco para dar lugar a un promedio de sólo 3 compara. Según el comentario de Sean, eliminé Math.Truncate. Juntos, esto aumentó las cosas alrededor del 10%. ¡Gracias!
Sospecho que está cerca del óptimo. Sin embargo, me interesaría ver cualquier respuesta ;-p –
Puede simplificar la devolución ligeramente para que sea 'return 1 + (int) Math.Log10 (x)' Creo –
Ah, sí, gracias Sean. – MichaelGG