2012-02-27 10 views
4

私は急いで数千のオブジェクトを構築する必要があるJavaコードのパフォーマンスチューニングを行っています。オブジェクトが適切にシンプルであり、コンストラクタがリーンで平均的であることを確認するなど、私が見てきたいくつかの明白なことがあります。また、いくつかのオブジェクトなどがない場合のオプションについても検討しています。コンストラクタより高速ですか?

コンストラクタの時間を短縮するために具体的なことはありますか?おそらくclone()や他のランタイムAPIを代わりに使用してコンストラクタを呼び出すことなく、適切な数のオブジェクトを適切な場所に配置する別の方法がありますか?あるいは、プログラムのこの部分を合理化するために、おそらくVMまたはコンパイラに与えることができるというヒントがありますか?

+1

なぜこれを高速にする必要がありますか?あなたが存在する必要のない問題を解決しようとしている可能性があります。 – Dykam

+1

OPの質問に対する答えは "おそらくそうではない"と思います。 –

+2

パフォーマンスプロファイリングはコンストラクタを遅くすることを指していますか?そして、評価するコードはどうですか? –

答えて

0

the flyweightパターンを見ると、オブジェクト間でデータを共有できます。

0

Javaでのオブジェクト作成オーバーヘッドを高速化する手法の1つは、パフォーマンスが重要なコードより前に(空の)オブジェクトのプールを作成することです。クリティカルなコードでは、新しいオブジェクトを作成するのではなく、既に作成されているオブジェクトを使用することができます。

もちろん、このオブジェクトプールの使用を自分で管理する必要があります(使用中のものと使用していないものを覚えておく必要があります)。あなたの特定のアプリケーションに応じて、これは簡単ではないか、より複雑かもしれません。

+0

あなたがこれを試してみると、言うまでもなく、熱心にプロフィール。事前割り当てとプーリングはコードの一部で時間を節約することができますが、Gregの言う管理やガーベジコレクションでは他にも多くの費用がかかります。 –

0

すぐには不要なオブジェクト状態の設定に遅延初期化を実行してください。

0

あなたは並列化できますか、スレッドをスピンアップして管理システムに戻しても、最小化しようとしている作成オーバーヘッドよりも時間がかかりますか?

1

可能な限りオブジェクトの作成を避けることをお勧めします。オブジェクトの作成にはコストがかかるだけでなく、あとでガベージコレクタによってそのオブジェクトがクリーンアップされます。

あなたのデータをプリミティブ型に絞り込み、シンプルな構造体のようなオブジェクトを事前に割り当てられた単純な型の配列に置き換え、オブジェクトを変更可能にしてリセットして、 (プールまたはアドホックを使用して)もっと長く必要な場合は、事前に割り当てられたByteBuffers /配列に構造体のようなデータを配置するためにJavolutionを使用します。新しいオブジェクトを作成する必要がある場合は、Javaコレクションを避けてください(メモリ使用量とオブジェクト割り当ての両方でオーバーヘッドが多い)、代わりに配列やTroveを試してみてください。

ロジックを単純化して、あまりにも多くのオブジェクトを最初から必要としないようにすることもできます。

いずれの場合でも、実際にボトルネックになっているものを最適化していることを知るためにプロファイリングを実行します。多くの場合、パフォーマンスのホットスポットは直感よりも異なる場所にあります。

関連する問題