(Como) o compilador Java JIT otimiza meu código?

Estou escrevendo um código de nível bastante baixo que deve ser altamente otimizado para velocidade. Cada ciclo da CPU conta. Como o código está em Java, não posso escrever em um nível tão baixo quanto em C, por exemplo, mas quero obter tudo da VM que pude

Estou processando uma matriz de bytes. Há duas partes do meu código que me interessam principalmente no momento. O primeiro é:

int key =  (data[i]     & 0xff)
        | ((data[i + 1] & 0xff) <<  8)
        | ((data[i + 2] & 0xff) << 16)
        | ((data[i + 3] & 0xff) << 24);

e o segundo é:

key = (key << 15) | (key >>> 17);

A julgar pelo desempenho, acho que essas declarações não são otimizadas da maneira que eu espero. A segunda declaração é basicamente umROTL 15, key. A primeira instrução carrega 4 bytes em um int. O0xffs máscaras @ existem apenas para compensar os bits de sinal adicionados resultantes da conversão implícita para int se o byte acessado for negativo. Isso deve ser fácil de traduzir para código de máquina eficiente, mas, para minha surpresa, o desempenho aumenta se eu remover as máscaras. (O que obviamente quebra meu código, mas eu estava interessado em ver o que acontece.)

O que está acontecendo aqui? As VMs Java mais comuns otimizam esse código durante o JIT da maneira que se espera que um bom compilador C ++ otimize o código C ++ equivalente? Posso influenciar esse processo? Configuração-XX:+AggressiveOpts parece não fazer diferença.

(CPU: x64, Plataforma: Linux / HotSpot)

questionAnswers(4)

yourAnswerToTheQuestion