私はJavaアプリケーションをプロファイリングしていましたが、オブジェクトの割り当てが予想よりもかなり遅くなっていることを発見しました。私は小さなオブジェクトの割り当ての全体的な速度を確立しようとするために単純なベンチマークを実行しました。小さなオブジェクト(3つの浮動小数点のベクトル)を割り当てることは私のマシンで約200ナノ秒かかるようです。私は(デュアルコア)2.0 GHzプロセッサで動作しているので、これはおよそ400 CPUサイクルです。 Javaアプリケーションのプロファイリングを行っている人たちに、そのような速度が期待されるかどうかを質問したかったのです。少し残酷で珍しいようです。Javaのメモリ割り当ての典型的な速度はどれくらいですか?
int obj_addr = heap_ptr;
heap_ptr += some_constant_size_of_object
return obj_addr;
....アセンブリの数行です:すべての後、私は、ヒープを圧縮し、オブジェクトを再配置することができますJavaのような言語は次のようなオブジェクト割り当て見て何かを持っていると思うだろう。ガベージコレクションに関して、私はそれが演奏されるのに十分なオブジェクトを割り当てたり破棄したりしません。オブジェクトを再利用してコードを最適化すると、処理する必要のあるオブジェクトあたり200ナノ秒ではなく、15ナノ秒/オブジェクトのオーダーのパフォーマンスが得られるため、オブジェクトを再利用するとパフォーマンスが大幅に向上します。私は本当にオブジェクトを再利用したくないです。なぜなら、それは表記法を毛づくりにしているからです(多くのメソッドは値を返す代わりにreceptacle
引数を受け入れる必要があります)。
問題は、オブジェクトの割り当てには長い時間がかかりますか?あるいは、一度修正すれば、これでより良いパフォーマンスを得ることができるかもしれないマシン上で何かが間違っているかもしれませんか?小さなオブジェクトの割り当ては一般に他の人にとってどのくらいかかるのですか?典型的な価値はありますか?私はクライアントマシンを使用しており、現時点ではコンパイルフラグは使用していません。あなたのマシン上のものがより速い場合、あなたのマシンのJVMバージョンとオペレーティングシステムは何ですか?
パフォーマンスに関しては、個々のマイレージが大きく異なる可能性があることを認識していますが、上記の数字が正しい球場のように見えるかどうかを尋ねています。
で再びそれを実行した場合
を(これは単なるコストを遅らせるかもしれないが)メモリ帯域幅は、おそらく支配しようとしています。 /プールを行うとGCが非効率になり、オブジェクトが分散されるとローカリティの問題が発生する可能性があります。おそらく最高のパフォーマンスを望むのは、整数オフセットを持つ1つの大きな配列(またはメモリマップされたバッファ)です。 (それはCやC++にも当てはまります。) –