2016-07-10 4 views
0

Javaでフィールドを持たないクラスのオブジェクトを作成するには、どれくらい多くのCPUサイクルまたは時間がかかりますか?私は同僚と議論していました。何かを得るためのユニークな方法のための新しいオブジェクトを作成したり、uuidを作成することは良いのかどうか、彼は防衛の目的でオブジェクトを作成することは最近Javaでは非常に軽量です。javaでオブジェクトの作成に必要なCPUサイクル数はいくつですか?

しかし、それはどうやってuuid世代のように全く違うものと比べることができますか?

したがって、オブジェクト&にどのような正確なステップが関与しているかを疑うにはどのくらいのCP​​Uサイクルが必要ですか?

+0

これは10ns未満です。 UUIDにははるかに長い時間がかかります。 –

+0

オブジェクト作成コストのほとんどのアカウントは、後でストレージを回復するためのガベージコレクションのコスト、またはガベージコレクションを実行可能にするためのメモリサイズのサイズの拡大をカバーしません。これは、リソース全体あなたが実際に請求したり気にかけている消費。しかし、どのような場合でも、ほとんどのUUIDルーチンは、どのような場合でもUUIDを保持するオブジェクトを作成してしまうため、オブジェクト作成のコストに関係なく、UUIDソリューションは安価になることはありません。 – mcdowella

+0

@PeterLawrey、時間のおかげで;どのくらいのステップが必要かを理解したいと考えています。そして、これは毎秒何百万という要求に対して起こります。 – Shashank

答えて

7

Javaでのオブジェクト作成には、0から数十億回のサイクルが必要です。

  • ゼロ:オブジェクトはローカルスコープをエスケープしていない場合、JITコンパイラが割り当て排除の最適化の結果として、ローカル変数との割り当てを交換することができます。
  • 十億、のいずれかの割り振りによって、ガベージコレクションが発生する可能性があります。

私は既にHotSpot JVMでの割り当ての概要をthisとと答えました。

  1. 負荷tlab_topポインタ(x64でスレッド地元の人々のための専用のCPUレジスタは、典型的には存在する)。

    TLABのオブジェクトを割り当てるための最も一般的な方法は以下の工程を含みます。

  2. オブジェクトのサイズだけインクリメントします。
  3. tlab_top + object_sizetlab_endを比較してください。必要に応じて低速のパスにジャンプします。
  4. tlab_topの新しい値を格納します。以前の値は新しく作成されたオブジェクトのアドレスです。
  5. オブジェクトのデフォルトヘッダーを設定します。
  6. klassフィールド(オブジェクトのクラスメタデータへのポインタ)を設定します。
  7. 残りのオブジェクトデータをゼロで初期化します。フィールドのないオブジェクトであっても、位置合わせ用のパディングがあります。

これらはすべて約10-15のCPU命令です。

JMHベンチマークでオブジェクト作成の平均時間を測定しましょう。

package bench; 

import org.openjdk.jmh.annotations.Benchmark; 

public class Alloc { 

    @Benchmark 
    public Object baseline() { 
     return "Some preallocated object"; 
    } 

    @Benchmark 
    public Object newObject() { 
     return new Object(); 
    } 
} 

結果:

Benchmark  Mode Cnt Score Error Units 
Alloc.baseline avgt 10 3,428 ± 0,089 ns/op 
Alloc.newObject avgt 10 4,505 ± 0,056 ns/op 

ので、ベンチマークのオーバーヘッドと一緒にオブジェクト割り当ては、2.4GHzのCPU上〜4.5ナノ秒または約11サイクルが必要です。それは確かにUUID生成アルゴリズムと比較して安いです。

関連する問題