All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openjdk.jmh.samples.JMHSample_07_FixtureLevelInvocation Maven / Gradle / Ivy

/*
 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package org.openjdk.jmh.samples;

import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.GenerateMicroBenchmark;
import org.openjdk.jmh.annotations.Level;
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.TearDown;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * Fixtures have different Levels to control when they are about to run.
 * Level.Invocation is useful sometimes to do some per-invocation work
 * which should not count as payload (e.g. sleep for some time to emulate
 * think time)
 * 

* One can run this sample with: * $ java -jar target/microbenchmarks.jar ".*JMHSample_07.*" -i 5 -r 1 -t 4 */ @OutputTimeUnit(TimeUnit.MICROSECONDS) public class JMHSample_07_FixtureLevelInvocation { /* * Fixtures have different Levels to control when they are about to run. * Level.Invocation is useful sometimes to do some per-invocation work, * which should not count as payload. PLEASE NOTE the timestamping and * synchronization for Level.Invocation helpers might significantly * offset the measurement, use with care. See Level.Invocation javadoc * for more discussion. * * Consider this sample: */ /* * This state handles the executor. * Note we create and shutdown executor with Level.Trial, so * it is kept around the same across all iterations. */ @State(Scope.Benchmark) public static class NormalState { ExecutorService service; @Setup(Level.Trial) public void up() { service = Executors.newCachedThreadPool(); } @TearDown(Level.Trial) public void down() { service.shutdown(); } } /* * This is the *extension* of the basic state, which also * has the Level.Invocation fixture method, sleeping for some time. */ public static class LaggingState extends NormalState { public static final int SLEEP_TIME = Integer.getInteger("sleepTime", 10); @Setup(Level.Invocation) public void lag() throws InterruptedException { TimeUnit.MILLISECONDS.sleep(SLEEP_TIME); } } /* * This allows us to formulate the task: measure the task turnaround in * "hot" mode when we are not sleeping between the submits, and "cold" mode, * when we are sleeping. */ @GenerateMicroBenchmark @BenchmarkMode(Mode.AverageTime) public double measureHot(NormalState e, final Scratch s) throws ExecutionException, InterruptedException { return e.service.submit(new Task(s)).get(); } @GenerateMicroBenchmark @BenchmarkMode(Mode.AverageTime) public double measureCold(LaggingState e, final Scratch s) throws ExecutionException, InterruptedException { return e.service.submit(new Task(s)).get(); } /* * This is our scratch state which will handle the work. */ @State(Scope.Thread) public static class Scratch { private double p; public double doWork() { p = Math.log(p); return p; } } public static class Task implements Callable { private Scratch s; public Task(Scratch s) { this.s = s; } @Override public Double call() { return s.doWork(); } } /* * ============================== HOW TO RUN THIS TEST: ==================================== * * You can see the cold scenario is running longer, because we pay for * thread wakeups. * * You can run this test: * * a) Via the command line: * $ mvn clean install * $ java -jar target/microbenchmarks.jar ".*JMHSample_07.*" -wi 5 -i 5 -f 1 * (we requested 5 warmup/measurement iterations, single fork) */ public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(".*" + JMHSample_07_FixtureLevelInvocation.class.getSimpleName() + ".*") .warmupIterations(5) .measurementIterations(5) .forks(1) .build(); new Runner(opt).run(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy