1

java.io.InputStream には、2 つの主要な読み取り関数int read()public int read(byte[] b, int off, int len) があります。

同様に、java.io.OutputStream には、write(b) と write((byte[] b, int off, int len))の 2 つの関数があります。

基本的な違いは分かるのですが、write(b)の記述を読むと「書き込むバイトは引数bの下位8ビット。bの上位24ビットは無視。」その場合、実際には、CPU が整数をロードする 32 ビット命令セットの残りの 24 ビットを無駄にしています。代わりに、他の書き込み ((byte[] b, int off, int len)) を使用すると、バイト配列のサイズのヒープ/スタックを占有します。高いスケーラビリティのためにどちらがうまく機能するかを考えようとしていますが、write(b) が 24 ビット (3 バイト) を浪費することを無視することはできません。一方、read/write(byte[] b, int off、int len)、スタックサイズが大きくなるリスクがあります。では、選択する最良のオプションは何ですか?

回避策として、InputStream と OutputStream を拡張し、32 ビットすべてを使用するために byte[4] を指定して read(b) と write(b) 関数をオーバーライドしようとしました。問題なく動作しますが、パフォーマンスが向上するかどうかを確認する必要があります。read/write(4, 0, int 4) を使用するのと非常によく似ています。

このトピックに関するヘルプ/コメントをいただければ幸いです。

4

2 に答える 2

1

を受け取るバージョンを使用するとbyte[]、バイト配列全体がスタックにプッシュされません。バイト配列への参照をスタックにプッシュします。

1 バイトだけを書き込んでいる場合を除き、常にbyte[].

于 2013-09-23T20:39:50.847 に答える
1

速度を達成したい場合は、一度に数バイトを読み書きすることをお勧めします。たとえば、ディスク上で何かを読み書きしたい場合、一度に全セクタ (4k または 8k バイト) を読み書きしたいかもしれません。

また、これを行うと、システム コールの数が最小限に抑えられるため、アプリケーションが高速になります。

スタックに関しては、Java ではバイト配列はヒープ上にあり、@Mike が述べたように参照のみがスタックに格納されます。

于 2013-09-23T20:43:17.103 に答える