Задать вопрос
Lite_stream
@Lite_stream

Почему скорость битовых операций отличается в 1000 раз?

В данном цикле для каждого из элементов исходного массива, каждый бит байта этого массива засисывается в переменную bit 2-мя разными способами, отличие в скорости примерно в 1000 раз. Моё предположение заключается в том, что массив MASKS вытесняется из кэша процессора (что маловероятно), в то время, как переменная MASK - нет. Есть ли у кого-то ещё какие-либо предположения, в чём дело ?
final byte[] MASKS =
        {
            (byte) 0b1000_0000, // 0
            (byte) 0b0100_0000, // 1
            (byte) 0b0010_0000, // 2
            (byte) 0b0001_0000, // 3
            (byte) 0b0000_1000, // 4
            (byte) 0b0000_0100, // 5
            (byte) 0b0000_0010, // 6
            (byte) 0b0000_0001, // 7
        };
final  byte MASK = (byte) 0b1000_0000;
int BYTE_COUNT = 2_000_000_000;

byte[] bytes = new byte[BYTE_COUNT];
byte bit;

double start = System.nanoTime();

for (int i = 0; i < BYTE_COUNT; ++i)
{
        byte currentByte = bytes[i];
         for (int j = 0; j < 8; ++j)
            {
                bit = (byte) (currentByte & MASKS[j]); // Elapsed time 6.2994273

//                bit = (byte) ((currentByte << j) & MASK); // Elapsed time 0.0054073
            }
}

double elapsedTime = (System.nanoTime() - start) / 1e9;
System.out.println("Elapsed time " + elapsedTime);
  • Вопрос задан
  • 255 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Скорее всего, обращение к массиву тормозит. Там, видимо, еще и проверки на попадание в границы массива происходят.

Если вы место обращения к массиву будете делать currentByte & (1 << (7-j)), то должно работать почти также быстро.

P.s. и вообще у вас какой-то странный выбор порядка битов. Обычно сдвигают вправо, к младшему биту. Тогда вместо маски будет тупо 0x1.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы