Potrzebuję wdrożyć możliwie jak najszybciej lewe przesunięcie bitowe tablicy 16-bajtowej w JavaCard.Szybkie przesunięcie bitowe tablicy bajtów - podklucze CMAC:
Próbowałem ten kod:
private static final void rotateLeft(final byte[] output, final byte[] input) {
short carry = 0;
short i = (short) 16;
do {
--i;
carry = (short)((input[i] << 1) | carry);
output[i] = (byte)carry;
carry = (short)((carry >> 8) & 1);
} while (i > 0);
}
pomysłów jak poprawić występ? Myślałem o magii Util.getShort(...)
i Util.setShort(...)
, ale nie udało mi się sprawić, by działała szybciej niż powyższa implementacja.
Jest to jedna z części obliczeń podkluczy CMAC i jest niestety często wykonywana. Jeśli znasz jakiś szybszy sposób obliczania podkluczy CMAC (oba podklucze w jednej pętli lub coś podobnego), proszę daj mi znać.
Gromadzenie danych JavaCard jest zapisywane? Jeśli tak, to polecam przyjrzenie się wygenerowanemu kodowi bajtowemu i optymalizację z uwzględnieniem dostępnych instrukcji. Na przykład podejrzewam, że ints może być lepszy niż szorty, a rozwijanie pętli może przynieść ci kilka cykli. Poza tym podejrzewam, że zamierzasz wykonać więcej niż jedną arytmetyczną operację o rozszerzonej precyzji, więc prawdopodobnie lepiej jest wcześnie przełączyć się na szerszą liczbę całkowitą, aby przyspieszyć przetwarzanie i przekonwertować z powrotem 8-bitową macierz na końcu. – doynax
@doynax nie ma 'int' lub' long' w JavaCard ... 'bajt' i' short' to wszystko, co masz. – vojta
Przepraszam za to, że brzmi to jak szczególnie uciążliwe środowisko pracy. Nadal mam jednak rację, miej oko na wygenerowany kod bajtowy, aby upewnić się, że kompilator nie zdecyduje się wygenerować niepotrzebnych instrukcji 'i2s' na pośrednich wynikach z krótkim, ale nie tak naprawdę. – doynax