В данном цикле для каждого из элементов исходного массива, каждый бит байта этого массива засисывается в переменную 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);