クライアント側コードの一部のパフォーマンスを測定するために、マルチスレッド コードでincrementAndGet
メソッドを使用しています。AtomicLong
@Override
public void run() {
long start = System.nanoTime();
attributes = client.getAttributes(columnsList);
long end = System.nanoTime() - start;
final AtomicLong before = select.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
}
上記のコードでは、時間を測定しようとしています-
client.getAttributes(columnsList);
とっている。
私の知る限り、incrementAndGet
メソッドは現在の値をアトミックに 1 ずつ増やします。これは、各スレッドが他のスレッドが値をインクリメントするのを待つ可能性があることを意味します。私は正しいですか?ブロックされるということでしょうか?
また、これはメソッドのパフォーマンスを測定する方法にも影響しますか? その測定にも余分な時間が追加されるということですか?
私がこれを尋ねている理由は、クライアント側コードとサーバー側コードのほとんどをベンチマークしようとしているからです。各メソッドにかかる時間を測定する必要がある場合は、次のように単純に実行しています-
測定したいコードが何であれ、通常はそのメソッドのすぐ上に以下の行を置きます
long start = System.nanoTime();
そして、これらの2行は同じ方法の後にありますが、ConcurrentHashMap
long end = System.nanoTime() - start;
final AtomicLong before = select.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
メソッドを使用しincrementAndGet
ていて、パフォーマンス測定に余分な時間を追加している場合、正確な結果が得られない可能性がありますか?
アップデート:-
これは以下の方法で、 で行ったときに取得しF3
ましincrementAndGet
たeclipse
。
ここに同期ブロックがあります。つまり、各スレッドはここで他のスレッドを待機します。そして、それはブロッキングコールです。
/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final synchronized long incrementAndGet() { //IBM-perf_AtomicLong
++value; //IBM-perf_AtomicLong
return value; //IBM-perf_AtomicLong
}
ああ。JVM を確認したところ、IBM JVM
と比較して実行されていSUN JVM
ます。私はこの特定のことを変えることができない会社で働いているので.
このロックベースのソリューションを回避して、メソッドのパフォーマンス/ベンチマークを測定する方法はありますか? 私は IBM JVM を実行していることに留意してください。
助けてくれてありがとう。