blob: c44d938e97edf7aa5c49918914a2eadb22c3c66b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.ignite.internal.benchmarks.jmh.misc;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.ignite.internal.processors.cache.PartitionUpdateCounterTrackingImpl;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
/**
* Benchmarks {@link PartitionUpdateCounterTrackingImpl} class.
*/
@State(Scope.Benchmark)
@Fork(1)
@Threads(1)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5, time = 2)
@Measurement(iterations = 10, time = 3)
public class JmhPartitionUpdateCounterBenchmark {
/** Buffer size to store testing gaps. */
private static final int GAPS_BUFFER_SIZE = 50;
/** Max delta for next counter value. */
private static final int COUNTER_MAX_DELTA= 50;
/** Testing gaps buffer. */
private final long [][] gapsBuf = new long[GAPS_BUFFER_SIZE][];
/** Random numbers generator. */
private Random rnd;
/** Counter. */
private final AtomicLong reservedCntr = new AtomicLong();
/** Partition update counter. */
private final PartitionUpdateCounterTrackingImpl partCntr = new PartitionUpdateCounterTrackingImpl(null);
/**
* Setup.
*/
@Setup(Level.Iteration)
public void setup() {
rnd = new Random(0);
reservedCntr.set(0);
for (int i = 0; i < GAPS_BUFFER_SIZE; i++) {
long cntrDelta = rnd.nextInt(COUNTER_MAX_DELTA);
gapsBuf[i] = new long[] {reservedCntr.getAndAdd(cntrDelta), cntrDelta};
}
partCntr.reset();
}
/**
* Update partition update counter with random gap.
*/
@Benchmark
public void updateWithGap() {
int nextIdx = rnd.nextInt(GAPS_BUFFER_SIZE);
partCntr.update(gapsBuf[nextIdx][0], gapsBuf[nextIdx][1]);
gapsBuf[nextIdx][0] = reservedCntr.getAndAdd(gapsBuf[nextIdx][1]);
}
/**
*
* @param args Args.
* @throws Exception Exception.
*/
public static void main(String[] args) throws Exception {
final Options options = new OptionsBuilder()
.include(JmhPartitionUpdateCounterBenchmark.class.getSimpleName())
.build();
new Runner(options).run();
}
}