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);
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Скорее всего, обращение к массиву тормозит. Там, видимо, еще и проверки на попадание в границы массива происходят.

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

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

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
26 апр. 2024, в 18:27
200000 руб./за проект
26 апр. 2024, в 18:24
80000 руб./за проект
26 апр. 2024, в 18:00
500 руб./за проект