У меня есть код, который делает много сравнений 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).
Update:
Я принял предложение Нормана и немного изменил ifs, в результате получилось в среднем всего 3 сравнения. Согласно комментарию Шона, я удалил Math.Truncate. Вместе это увеличило примерно 10%. Спасибо!