Was ist der schnellste Weg, um eine richtige zirkuläre Bitverschiebung für ein Byte-Array durchzuführen?

9

Wenn ich das Array habe:

%Vor%

Das Ergebnis für eine 1-Bit-Verschiebung ist:

%Vor%

Die Array-Größe ist nicht festgelegt, und die Verschiebung wird von 1 bis einschließlich 7 sein. Zur Zeit habe ich den folgenden Code (was gut funktioniert):

%Vor%

Gibt es dafür einen schnelleren Weg als meinen derzeitigen Ansatz?

    
Motasim 22.03.2012, 15:23
quelle

4 Antworten

4

Die einzige Möglichkeit, dies herauszufinden, ist ein gründliches Benchmarking, und die schnellsten Implementierungen variieren von Plattform zu Plattform. Verwenden Sie ein Tool wie Caliper , wenn Sie dies wirklich optimieren müssen.

    
Louis Wasserman 22.03.2012 15:32
quelle
1

Sie können (byte[a]&0xff)>>b durch byte[a]>>>b

ersetzen

Außerdem brauchst du &0xff nicht, wenn du schiebst.

Auch wenn es egal ist, kann das Hinzufügen von final zu tmp oder das Verschieben der Deklaration aus der Schleife ein kleines bisschen helfen.

Eine andere Sache könnte versuchen:

%Vor%

Dann lösen Sie danach Bytes [bytes.length-1].

Diese umgekehrte Schleife kann auch helfen, wenn Sie abergläubisch sind. Ich habe es schon vorher gesehen.

Schleifenanalyse pro Durchlauf:

deins: 3 Aufgaben, zwei Schichten, eine oder eine Besetzung.

meins: 2 Aufgaben, zwei Schichten, eine oder eine Besetzung.

    
warren 06.05.2012 06:03
quelle
0

Sie können dies zu Longs und mehr als einer Bitverschiebung verallgemeinern, wenn Sie möchten

%Vor%

unter der Annahme rotr ist definiert.

    
Mike Dunlavey 22.03.2012 20:15
quelle
0
___ answer9825519 ___

Die einzige Möglichkeit, dies herauszufinden, ist ein gründliches Benchmarking, und die schnellsten Implementierungen variieren von Plattform zu Plattform. Verwenden Sie ein Tool wie Caliper , wenn Sie dies wirklich optimieren müssen.

    
___ answer9829804 ___

Sie können dies zu Longs und mehr als einer Bitverschiebung verallgemeinern, wenn Sie möchten

%Vor%

unter der Annahme ByteBuffer.wrap ist definiert.

    
___ qstnhdr ___ Was ist der schnellste Weg, um eine richtige zirkuläre Bitverschiebung für ein Byte-Array durchzuführen? ___ answer10468521 ___

Sie können byte[] durch ByteBuffer.asLongBuffer()

ersetzen

Außerdem brauchst du long nicht, wenn du schiebst.

Auch wenn es egal ist, kann das Hinzufügen von final zu %code% oder das Verschieben der Deklaration aus der Schleife ein kleines bisschen helfen.

Eine andere Sache könnte versuchen:

%Vor%

Dann lösen Sie danach Bytes [bytes.length-1].

Diese umgekehrte Schleife kann auch helfen, wenn Sie abergläubisch sind. Ich habe es schon vorher gesehen.

Schleifenanalyse pro Durchlauf:

deins: 3 Aufgaben, zwei Schichten, eine oder eine Besetzung.

meins: 2 Aufgaben, zwei Schichten, eine oder eine Besetzung.

    
___ antwort12993284 ___

Verwenden Sie %code% , um einen Puffer zu erhalten, der Ihr %code% umschließt und dann %code% , um eine Ansicht zu erhalten, mit der Sie %code% s wie von @ NiklasB vorgeschlagen extrahieren und bearbeiten können. Dadurch wird die Fähigkeit der Hardware genutzt, größere Teile von Bits zu verschieben.

    
___ tag123bitmanipulation ___ Die Manipulation einzelner Bits. Verwendete Operatoren können bitweise UND, ODER, XOR, NICHT, Linksverschiebung und Rechtsverschiebung enthalten. ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ tag123optimierung ___ Optimierung ist der Akt der Verbesserung einer Methode oder eines Designs. In der Programmierung nimmt die Optimierung normalerweise die Form an, die Geschwindigkeit eines Algorithmus zu erhöhen oder die benötigten Ressourcen zu reduzieren. Eine weitere Bedeutung der Optimierung sind numerische Optimierungsalgorithmen. ___ qstntxt ___

Wenn ich das Array habe:

%Vor%

Das Ergebnis für eine 1-Bit-Verschiebung ist:

%Vor%

Die Array-Größe ist nicht festgelegt, und die Verschiebung wird von 1 bis einschließlich 7 sein. Zur Zeit habe ich den folgenden Code (was gut funktioniert):

%Vor%

Gibt es dafür einen schnelleren Weg als meinen derzeitigen Ansatz?

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___
Mike Samuel 20.10.2012 22:33
quelle