2011-01-15 4 views
2

JavaでI/O操作を実行する場合、オブジェクトデータストリーム(ObjectInputStreamなど)を使用する方が一般的に効率的です(コンピューティングリソースの点で)か、DataInputStreamなどのプリミティブデータストリームを使用する方が効率的ですか?オブジェクトデータストリームまたはプリミティブデータストリームをJavaで使用する方が効率的ですか?

オブジェクトデータストリームを使用する方が効率的であれば、オブジェクトの作成に関連するオーバーヘッド(最小限に抑える)を考慮すると、オブジェクトデータストリームがさらに効率的になりますか?

答えて

2

ObjectInputStreamの使用が簡単になります。私はこれがDataInputStreamを使用する努力に行く前に十分に速くないことを確認します。 DataInputStreamは、NIO/ByteBufferを使用する場合ほど効率的ではありませんが、その努力は、比較的小さな改善のために増加します。

3

ストリームに実際にどのような種類のデータがあるかに基づいて、オブジェクトまたはデータ入力ストリームを選択します。 Javaオブジェクトの場合はObjectストリームを使用し、そうでなければDataInputStream(またはその他の適切なもの)を使用します。

ストリームにはどのような種類のデータがありますか?

+0

私は選択肢があります。私は新しいクラスを作り、オブジェクトにデータを入れたり、プリミティブデータとして送ることができます。より効率的なものを見つけようとしています。 – ubiquibacon

+0

次にいくつかのベンチマークを書いてそれを理解する。効率性はここで見ている最後のものです。より重要な要素は、他の言語がこのシステムとやり取りする必要があるようなものです。それは常にJavaだけか、.NETやPerlやXと接続する必要がありますか?それはあなたの選択に大きな影響を与えるからです。これまでにJavaだけの場合は、OOのアプローチをお勧めし、OOSを使用します。 –

+0

ByteBufferまたはObjectOutput/InputStream(またはバスト)。また、マイクロベンチマークを正しく記述する方法がわからない場合、マイクロベンチマークはJavaで行うのが最も簡単な作業の1つです。 – bestsss

2

オブジェクトのシリアライゼーション/デシリアライズは、Javaに重いものの1つです。したがって、これがプログラムのパフォーマンス上重要な部分である場合は、オブジェクトの直列化を避けることが役に立ちます。多くの場合、ボトルネックが他の場所にあるものの、時期尚早の最適化を行う可能性があります。したがって、IMHOでは、これがボトルネックになることがわかっていない場合、ObjectInputStreamを使用して後で最適化します。

+2

後で異種メソッドに切り替える必要がある場合に備えて、シリアライゼーション/オブジェクト転送ビジネスを残りのコードと分離しておくこともお勧めします。 – biziclop

4

カスタムシリアル化により、スペース/帯域幅とCPU時間が節約できます(正しく実行されている場合)。

GoogleのProtocol Buffersを見ることをお勧めします。非常に効率的で移植性の高いシリアル化ライブラリです。

1

なぜあなたは何をしたいかを書いてはいけません。いくつかのテストをその周りに置いて、それが動作することを知ってください。そしてそれが問題になった場合は、実装を簡単に何かに置き換えることができ、騒ぎや煩わしさはありません。それが問題ではないことが判明した場合、このような大部分の事柄は、あなたが何か不必要なものに時間を費やすことはなく、あなたは時期尚早に最適化されることはありません。

XstreamIsはこの種のものをかなり簡単に発射し、非常に使いやすいです。

あなたのアーキテクチャが過度に冗談でない場合は、このビットを最適化する必要はありません。

関連する問題