У меня есть код, который выполняет множество сравнений 64-битных целых чисел, однако он должен учитывать длину числа, как если бы оно было отформатировано как строка. Я не могу изменить код вызова, только функцию.
Самый простой способ (помимо .ToString (). Length):
(int)Math.Truncate(Math.Log10(x)) + 1;
Однако это работает довольно плохо. Поскольку мое приложение отправляет только положительные значения, а длины довольно равномерно распределены между 2 и 9 (с некоторым смещением в сторону 9), я предварительно вычислил значения и имел операторы 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
}
}
Это позволяет вычислить длину в среднем 4 раза.
Итак, есть ли другие уловки, которые я могу использовать, чтобы ускорить эту функцию?
Изменить: это будет работать как 32-битный код (Silverlight).
Обновлять:
Я воспользовался предложением Нормана и немного изменил «если», чтобы получить в среднем всего 3 сравнения. Согласно комментарию Шона, я удалил Math.Truncate. Вместе это повысило цены примерно на 10%. Спасибо!