Package co.paralleluniverse.concurrent.util

Source Code of co.paralleluniverse.concurrent.util.DelayQueueBenchmark

/*
* Copyright 2012 Real Logic Ltd.
*
* 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 co.paralleluniverse.concurrent.util;

import java.util.Queue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

/**
*
* @autor pron
*/
public class DelayQueueBenchmark {
    private static final boolean SEQUENCED = true;
    public static final int NUM_PRODUCERS = 5;
    public static final int REPETITIONS = 10 * 1000 * 1000;
    public static final Integer TEST_VALUE = Integer.valueOf(777);

    public static void main(String[] args) throws Exception {
        timeQueue(1);   // SingleConsumerArrayObjectQueue
        timeQueue(2);   // SingleConsumerLinkedObjectQueue
    }

    private static void timeQueue(int type) throws Exception {
        final Queue<DelayedValue> queue = createQueue(type);
        if (queue == null)
            return;
        System.out.println("===== " + queue.getClass().getSimpleName() + ", " + NUM_PRODUCERS + " producers ===");
        for (int i = 0; i < 5; i++) {
            System.gc();
            System.gc();
            performanceRun(i, queue);
        }
    }

    private static Queue<DelayedValue> createQueue(int type) {
        switch (type) {
            case 1:
                return new DelayQueue<DelayedValue>();
            case 2:
                return new SingleConsumerNonblockingProducerDelayQueue<DelayedValue>();

            default:
                throw new IllegalArgumentException("Invalid option: " + type);
        }
    }


    private static void performanceRun(final int runNumber, final Queue<DelayedValue> queue) throws Exception {
        final long start = System.nanoTime();
        final int repetitions = (REPETITIONS / NUM_PRODUCERS) * NUM_PRODUCERS;
        final Thread[] producers = new Thread[NUM_PRODUCERS];

        for (int t = 0; t < NUM_PRODUCERS; t++) {
            producers[t] = new Thread(new Runnable() {
                @Override
                public void run() {
                    final ThreadLocalRandom rand = ThreadLocalRandom.current();
                    int i = REPETITIONS / NUM_PRODUCERS;
                    do {
                        while (!queue.offer(DelayedValue.instance(SEQUENCED, TEST_VALUE, rand.nextInt(0, 11))))
                            Thread.yield();
                    } while (0 != --i);
                }
            });
        }

        for (int t = 0; t < NUM_PRODUCERS; t++)
            producers[t].start();

        DelayedValue result;
        int i = repetitions;
        do {
            while (null == (result = queue.poll()))
                Thread.yield();
        } while (0 != --i);

        for (int t = 0; t < NUM_PRODUCERS; t++)
            producers[t].join();

        final long duration = System.nanoTime() - start;
        final long ops = (repetitions * TimeUnit.SECONDS.toNanos(1)) / duration;
        System.out.format("%d - ops/sec=%,d - %s result=%s\n",
                Integer.valueOf(runNumber), Long.valueOf(ops),
                queue.getClass().getSimpleName(), result);
    }
   
}
TOP

Related Classes of co.paralleluniverse.concurrent.util.DelayQueueBenchmark

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.