DNAに言及しているように、予め充填されたバッファーを有し、ByteBuffer.put(ByteBuffer)
を使用することはおそらく最も速い移植可能な方法です。
public static void fill(ByteBuffer buf, byte b) {
if (buf.hasArray()) {
final int offset = buf.arrayOffset();
Arrays.fill(buf.array(), offset + buf.position(), offset + buf.limit(), b);
buf.position(buf.limit());
} else {
int remaining = buf.remaining();
if (UNALIGNED_ACCESS) {
final int i = (b << 24) | (b << 16) | (b << 8) | b;
final long l = ((long) i << 32) | i;
while (remaining >= 8) {
buf.putLong(l);
remaining -= 8;
}
}
while (remaining-- > 0) {
buf.put(b);
}
}
}
UNALIGNED_ACCESS
を設定すると、お使いのJREの実装とプラットフォームのいくつかの知識が必要です。それは実用的ではない場合は、適用可能な場合Arrays.fill
かUnsafe.putLong
のいずれかを利用するには、このような何かを行うことができます。ここでは、JACを使用している場合のOracle JREの設定方法について説明します(これは、os.arch
システムプロパティにアクセスするための便利で標準的な方法としてPlatform.ARCH
を提供します)。
/**
* Indicates whether the ByteBuffer implementation likely supports unaligned
* access of multi-byte values on the current platform.
*/
private static final boolean UNALIGNED_ACCESS = Platform.ARCH.startsWith("x86");
このユースケースについてもう少し詳しく説明できますか?あなたはバイトバッファを何から得ますか? – jontro
なぜバッファをゼロにする必要があると思いますか? – EJP
ダイレクトバッファーですか?そうでなければ、ByteBuffer.wrap(new byte [123456]); ' –