読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

java.nioのBufferは速い?

java.nioのByteBufferについてちょっと調べてみた。


ByteBufferにはダイレクトバッファーと非ダイレクトバッファーの2種類がある。

ダイレクトバッファーはJVMの外の領域にメモリを確保し、非ダイレクトバッファーはメモリをJVM内に取る。


話ではダイレクトバッファーでも補助配列が使えるという事だったが、調べてみたところそれは嘘であった。


JavaDocからは見えないがByteBufferは実は抽象クラスでそのインスタンスを作成する事はできない。ダイレクトバッファーか非ダイレクトバッファーかで作成されるインスタンスのクラスが違う。DirectByteBufferがダイレクトバッファーのクラスで、非ダイレクトバッファーはHeapByteBuffer だ。


そして、array()関数で返される補助配列というのは、補助配列と呼ぶにはお粗末なHeapByteBufferのバッファー部分本体だ。ぬぁにが補助だ。本体配列と呼べ。

このバッファーはDirectByteBufferではnullになっているので、エラーが出る。


よって、JAVAからDirectByteBufferの値を変更するにはput関数を通さなくてはならず、関数のオーバーヘッドがある上に、そもそもput(配列)で配列を保持するならそもそも外部に領域を取った意味が無い。JNIとかでネイティブコードを実行するなら早くなるだろうが。


というわけで、配列最強が結論。