Ich muss so schnell wie möglich die linke Bitverschiebung eines 16-Byte-Arrays in JavaCard implementieren.Schnelle Bitverschiebung eines Bytearrays - CMAC-Unterschlüssel
habe ich versucht, diesen Code:
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);
}
Irgendwelche Ideen, wie man die Performace verbessern? Ich dachte an etwas Util.getShort(...)
und Util.setShort(...)
Magie, aber ich schaffte es nicht, es schneller als die Implementierung oben zu arbeiten.
Dies ist ein Teil der CMAC-Unterschlüssel Berechnung und es wird leider oft gemacht. Falls Sie einen schnelleren Weg zur Berechnung von CMAC-Unterschlüsseln (beide Unterschlüssel in einer Schleife oder ähnlichem) kennen, lassen Sie es mich bitte wissen.
Ich nehme an, JavaCard ist interpated? Wenn das der Fall ist, würde ich empfehlen, dass Sie sich den generierten Byte-Code ansehen und ihn mit dem verfügbaren Befehlssatz optimieren. Zum Beispiel vermute ich, dass Ints Shorts vorzuziehen sind, und dass das Loop-Abrollverfahren Ihnen ein paar Zyklen einbringen könnte. Darüber hinaus vermute ich, dass Sie mehr als eine einzige arithmetische Operation mit erweiterter Genauigkeit ausführen werden, daher ist es wahrscheinlich ratsam, früh auf eine breitere Ganzzahl zu wechseln, um die Verarbeitung zu beschleunigen, und am Ende ein 8-Bit-Array zu konvertieren. – doynax
@doynax gibt es keine 'int' oder' long' in JavaCard ... 'byte' und' short' ist alles was du hast. – vojta
Sorry, klingt wie eine besonders lähmende Umgebung, mit der man arbeiten kann. Mein Punkt bleibt jedoch, behalte den erzeugten Byte-Code im Auge, um sicherzustellen, dass der Compiler nicht entscheidet, unnötige 'i2s'-Anweisungen für die Zwischen-Kurz-von-int-aber-nicht-wirklich-Ergebnisse zu erzeugen. – doynax