/* * Copyright (C) 2014 Robert Stupp, Koeln, Germany, robert-stupp.de * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.caffinitas.ohc.benchmark; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import com.codahale.metrics.Clock; import com.codahale.metrics.Histogram; import com.codahale.metrics.UniformReservoir; public final class MergeableTimerSource { private final Clock clock; private final AtomicLong count; private final AtomicReference<Histogram> histogram; public MergeableTimerSource() { this.clock = Clock.defaultClock(); this.count = new AtomicLong(); this.histogram = new AtomicReference<>(new Histogram(new UniformReservoir())); } public <T> T time(Callable<T> event) throws Exception { final long startTime = clock.getTick(); try { return event.call(); } finally { update(clock.getTick() - startTime); } } public void mergeTo(MergeableTimer timer) { Histogram hist = this.histogram.getAndSet(new Histogram(new UniformReservoir())); for (long l : hist.getSnapshot().getValues()) timer.histogram.update(l); timer.meter.mark(count.getAndSet(0L)); } private void update(long duration) { if (duration >= 0) { histogram.get().update(duration); count.incrementAndGet(); } } public void clear() { this.histogram.set(new Histogram(new UniformReservoir())); this.count.set(0L); } }