--- jsr166/src/test/loops/LoopHelpers.java 2005/05/02 19:19:38 1.1 +++ jsr166/src/test/loops/LoopHelpers.java 2005/09/15 16:55:40 1.5 @@ -1,3 +1,8 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/licenses/publicdomain + */ /** * Misc utilities in JSR166 performance tests */ @@ -66,17 +71,90 @@ class LoopHelpers { return 36969 * (x & 65535) + (x >> 16); } + /** + * Marsaglia xorshift (1, 3, 10) + */ + public static int compute6(int seed) { + seed ^= seed << 1; + seed ^= seed >>> 3; + seed ^= (seed << 10); + return seed; + } + + /** + * Marsaglia xorshift (6, 21, 7) + */ + public static int compute7(int y) { + y ^= y << 6; + y ^= y >>> 21; + y ^= (y << 7); + return y; + } + + + /** + * Marsaglia xorshift for longs + */ + public static long compute8(long x) { + x ^= x << 13; + x ^= x >>> 7; + x ^= (x << 17); + return x; + } + + public static final class XorShift32Random { + static final AtomicInteger seq = new AtomicInteger(8862213); + int x = -1831433054; + public XorShift32Random(int seed) { x = seed; } + public XorShift32Random() { + this((int)System.nanoTime() + seq.getAndAdd(129)); + } + public int next() { + x ^= x << 6; + x ^= x >>> 21; + x ^= (x << 7); + return x; + } + } + + + /** Multiplication-free RNG from Marsaglia "Xorshift RNGs" paper */ + public static final class MarsagliaRandom { + static final AtomicInteger seq = new AtomicInteger(3122688); + int x; + int y = 842502087; + int z = -715159705; + int w = 273326509; + public MarsagliaRandom(int seed) { x = seed; } + public MarsagliaRandom() { + this((int)System.nanoTime() + seq.getAndAdd(129)); + } + public int next() { + int t = x ^ (x << 11); + x = y; + y = z; + z = w; + return w = (w ^ (w >>> 19) ^ (t ^ (t >>> 8))); + } + } /** - * An actually useful random number generator, but unsynchronized. - * Basically same as java.util.Random. + * Unsynchronized version of java.util.Random algorithm. */ - public static class SimpleRandom { + public static final class SimpleRandom { private final static long multiplier = 0x5DEECE66DL; private final static long addend = 0xBL; private final static long mask = (1L << 48) - 1; - static final AtomicLong seq = new AtomicLong(1); - private long seed = System.nanoTime() + seq.getAndIncrement(); + static final AtomicLong seq = new AtomicLong( -715159705); + private long seed; + + SimpleRandom(long s) { + seed = s; + } + + SimpleRandom() { + seed = System.nanoTime() + seq.getAndAdd(129); + } public void setSeed(long s) { seed = s; @@ -90,18 +168,19 @@ class LoopHelpers { } public static class BarrierTimer implements Runnable { - public volatile long startTime; - public volatile long endTime; + volatile boolean started; + volatile long startTime; + volatile long endTime; public void run() { long t = System.nanoTime(); - if (startTime == 0) + if (!started) { + started = true; startTime = t; - else + } else endTime = t; } public void clear() { - startTime = 0; - endTime = 0; + started = false; } public long getTime() { return endTime - startTime;