私は現在、2 つのビット配列の連結がボトルネックであることを特定したコードを作成しており、それをより効率的にする方法について議論しています。
私のビット配列は次のようにモデル化されています
public BitArray(int size) {
int sizeBytes = size / 8 ;
if (size % 8 !=0) sizeBytes++;
this.array = new byte[sizeBytes];
this.size = size ;
}
size はビット単位のサイズです。
2 つのビット配列を効率的に連結する際の課題は、たとえばサイズ 7 のビット配列をサイズ 6 のビット配列と連結するときに発生する必要があるストラドリングです。そのため、単純に 2 つの配列コピーを行うことはできません。
私が現在実装しているものに加えて、私が調査しているソリューションは次のとおりです。「ストラドル領域」(たとえば、5 ビット配列の最後の 3 ビット) を計算します。system.array.copy を使用して最初の配列をコピーし、setBit 関数を使用して 2 番目の配列から 3 つの「またがるビット」を手動で設定します。2 番目の配列を 3 だけ左にシフトします。System.arraycopy()
現在、以下に示すように、2 番目の配列の個々のビットを手動で設定しています。
問題は、ビットシフトでは、バイトごとに実行する必要があるため、実際には操作に非常にコストがかかり、再度またぐ必要があることです。
上記のテクニックを改善する方法について考えていますか?
パフォーマンスが悪い現在のコードは次のとおりです。
public static BitArray concatenate(BitArray x1_, BitArray x2_) {
if (x1_ == null) {
System.out.println("x1 is null");
int b = x2_.getArray().length;
byte[] array = new byte[b];
System.arraycopy(x2_.getArray(), 0, array, 0, b);
BitArray res = new BitArray(array);
res.setSize(x2_.getSize());
return res;
} else if (x2_ == null) {
System.out.println("x2 is null");
int b = x1_.getArray().length;
byte[] array = new byte[b];
System.arraycopy(x1_.getArray(), 0, array, 0, b);
BitArray res = new BitArray(array);
res.setSize(x1_.getSize());
return res;
}
int size1 = x1_.getSize();
int size2 = x2_.getSize();
int size = (x1_.getSize() + x2_.getSize()) / 8 ;
if ((size1 + size2)%8!=0) size++;
byte[] result = new byte[size];
System.arraycopy(x1, 0, result, 0, x1.length);
BitArray res = new BitArray(result);
res.setSize(size1 + size2);
for (int i = 0 ; i<size2 ; i++) {
res.setBit(size1 + i, x2_.getBit(i) );
}
return res;
}