Просматривая вопрос о микрооптимизации, который я задал вчера ( здесь ), я обнаружил нечто странное: оператор or
в Java выполняется немного быстрее, чем поиск логическое значение в массиве логических значений.
В моих тестах при выполнении приведенных ниже алгоритмов на long
значениях от 0 до 1 миллиарда alg1 работает примерно на 2% быстрее. (Я изменил порядок, в котором тестируются алгоритмы, и получаю те же результаты). Мой вопрос: Почему alg1 быстрее? Я бы ожидал, что alg2 будет немного быстрее, поскольку он использует таблицу поиска, тогда как alg1 должен выполнить 4 сравнения и 3 или операции для 75% входных данных.
private final static boolean alg1(long n)
{
int h = (int)(n & 0xF);
if(h == 0 || h == 1 || h == 4 || h == 9)
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
return false;
}
private final static boolean[] lookup = new boolean[16];
static
{
lookup[0] = lookup[1] = lookup[4] = lookup[9] = true;
}
private final static boolean alg2(long n)
{
if(lookup[(int)(n & 0xF)])
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
else
return false;
}
Если вам интересно, этот код проверяет, является ли число совершенным квадратом, и использует тот факт, что совершенные квадраты должны заканчиваться на 0, 1, 4 или 9 в шестнадцатеричном виде.