You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Artem Barger (JIRA)" <ji...@apache.org> on 2016/08/09 12:31:20 UTC

[jira] [Commented] (RNG-2) Allow creation and execution of JMH based benchmarks

    [ https://issues.apache.org/jira/browse/RNG-2?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15413446#comment-15413446 ] 

Artem Barger commented on RNG-2:
--------------------------------

For example I've create a simple benchmark, to estimate value of PI

{code:java}
/*
 * Copyright (c) 2014, Oracle America, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 *  * Neither the name of Oracle nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.apache.commons.rng.internal.benchmark;

import org.apache.commons.rng.RandomSource;
import org.apache.commons.rng.UniformRandomProvider;
import org.openjdk.jmh.annotations.*;

import java.util.concurrent.TimeUnit;

/**
 * Benchmark which compare performance of different implementations of the
 * {@link org.apache.commons.rng.internal.source32.IntProvider} by running a simple workload of PI computation.
 *
 * The computation estimates value of PI by computing the probability of point p=(x, y) to lay down in the circle of
 * radius one inscribed in the square. The probability could be computed by area_of_circle/area_of_square, where it's
 * easy to see that area_of_circle = PI * R^2 and area_of_square=4*R^2, therefore the probability is PI/4.
 *
 * Now, the computation will run Monte Carlo simulation to produce 10^6 pairs of (x, y) and count the portion of pairs
 * which satisfies inequality x^2 + y^2 <=1 to overall number of points (10^6). Obviously the portion value is the
 * approximation of the probability of point to lay down inside the circle and could be used to approximate PI, since
 * PI ~= 4 * portion, where portion = (points inside the circle)/(overall points).
 *
 */
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
public class PiComputationBenchmark {

    @State(Scope.Benchmark)
    /**
     * The benchmark state to initialize the random source provide with different algorithm.
     */
    public static class RandomIntBasedSources {

        /**
         * A list of int random source providers.
         */
        @Param({"JDK", "WELL_512_A", "WELL_1024_A", "WELL_19937_A", "WELL_19937_C",
                "WELL_44497_A", "WELL_44497_B", "MT", "ISAAC"})
        String randomSourceName;

        /**
         * Number of pairs to generate during Monte-Carlo simulation.
         */
        @Param({"1000000"})
        long pairsToGenerate;

        UniformRandomProvider provider;

        @Setup
        public void setup() {
            final RandomSource randomSource = RandomSource.valueOf(randomSourceName);
            provider = RandomSource.create(randomSource);
        }
    }

    @Benchmark
    public double computePi(RandomIntBasedSources data) {
        long pairsInCircle = 0;
        for (int i = 0; i < data.pairsToGenerate; i++) {
            double x = data.provider.nextDouble();
            double y = data.provider.nextDouble();
            if ((x*x + y*y) <= 1) {
                pairsInCircle ++;
            }
        }

        return (4d*pairsInCircle)/data.pairsToGenerate;
    }

}
{code}

and was able to get following results out of it:
{noformat}
# Run complete. Total time: 00:01:35

Benchmark                         (pairsToGenerate)  (randomSourceName)  Mode  Cnt      Score       Error  Units
PiComputationBenchmark.computePi            1000000                 JDK  avgt    5  44076.310 ±  2794.888  us/op
PiComputationBenchmark.computePi            1000000          WELL_512_A  avgt    5  19374.112 ±  4973.542  us/op
PiComputationBenchmark.computePi            1000000         WELL_1024_A  avgt    5  20575.240 ±  4298.444  us/op
PiComputationBenchmark.computePi            1000000        WELL_19937_A  avgt    5  42208.136 ±  2062.648  us/op
PiComputationBenchmark.computePi            1000000        WELL_19937_C  avgt    5  45105.231 ±  2752.918  us/op
PiComputationBenchmark.computePi            1000000        WELL_44497_A  avgt    5  49710.663 ± 15786.830  us/op
PiComputationBenchmark.computePi            1000000        WELL_44497_B  avgt    5  48984.700 ±  2449.719  us/op
PiComputationBenchmark.computePi            1000000                  MT  avgt    5  22466.565 ±  1377.585  us/op
PiComputationBenchmark.computePi            1000000               ISAAC  avgt    5  21615.283 ±  1080.331  us/op
{noformat}

> Allow creation and execution of JMH based benchmarks
> ----------------------------------------------------
>
>                 Key: RNG-2
>                 URL: https://issues.apache.org/jira/browse/RNG-2
>             Project: Commons RNG
>          Issue Type: Bug
>            Reporter: Artem Barger
>         Attachments: RNG-2.patch
>
>
> Add relevant maven changes to enable creation and execution of benchmarks based on JMH (Java Microbenchmarks harness) framework.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)