blob: dbc5de33c859372fcc56f9c2267581e3bf48dbc1 [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.reef.wake.test.examples;
import org.junit.Assert;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Tests for ConcurrentSkipListMap.
*/
public class SkipListTest {
public static void main(final String[] arg) {
final SkipListTest t = new SkipListTest();
t.testPoll();
t.testHigher();
t.testHigherRemove();
t.testHigherRemoveM();
t.testHigherRemoveSeekM();
t.testHigherRemoveSeekBoundedM();
t.testHigherRemoveViewBoundedM();
t.testSeparateMaps();
t.testPollM();
}
//@Test
public void testPoll() {
System.out.println("poll");
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
final long outstart = System.currentTimeMillis();
while (x.pollFirstEntry() != null) {
//
}
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
//@Test
public void testHigher() {
System.out.println("higher");
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
Integer k = x.pollFirstEntry().getKey();
while ((k = x.higherKey(k)) != null) {
//
}
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
public boolean nThreads(final int n, final Runnable r, final long timeout, final TimeUnit t) {
final ExecutorService e = Executors.newCachedThreadPool();
for (int i = 0; i < n; i++) {
e.submit(r);
}
e.shutdown();
try {
return e.awaitTermination(timeout, t);
} catch (final InterruptedException e1) {
e1.printStackTrace();
return false;
}
}
//@Test
public void testHigherRemove() {
System.out.println("higher/remove");
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
Integer k = x.pollFirstEntry().getKey();
x.remove(k);
while ((k = x.higherKey(k)) != null) {
x.remove(k);
}
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
//@Test
public void testHigherRemoveM() {
final int numOutW = 4;
System.out.println("higher/remove " + numOutW);
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
Integer k = x.pollFirstEntry().getKey();
x.remove(k);
while ((k = x.higherKey(k)) != null) {
x.remove(k);
}
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
//@Test
public void testHigherRemoveSeekM() {
for (int numOutW = 1; numOutW <= 24; numOutW += 1) {
System.out.println("higher/remove seek " + numOutW);
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
final AtomicInteger uid = new AtomicInteger(0);
final int blockSize = unique / numOutW;
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
final int id = uid.getAndIncrement();
final Integer startK = x.ceilingKey(blockSize * id);
Integer k = startK;
x.remove(k);
while ((k = x.higherKey(k)) != null) {
x.remove(k);
}
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
}
//@Test
public void testHigherRemoveSeekBoundedM() {
for (int numOutW = 1; numOutW <= 24; numOutW += 1) {
System.out.println("higher/remove seek " + numOutW);
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
final AtomicInteger uid = new AtomicInteger(0);
final int blockSize = unique / numOutW;
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
final int id = uid.getAndIncrement();
final Integer startK = x.ceilingKey(blockSize * id);
final Integer endK = x.ceilingKey(blockSize * (id + 1));
Integer k = startK;
do {
x.remove(k);
k = x.higherKey(k);
} while (k != null && k < endK);
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
}
//@Test
public void testHigherRemoveViewBoundedM() {
for (int numOutW = 1; numOutW <= 24; numOutW += 1) {
System.out.println("higher/remove view " + numOutW);
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
final AtomicInteger uid = new AtomicInteger(0);
final int blockSize = unique / numOutW;
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
final int id = uid.getAndIncrement();
final ConcurrentNavigableMap<Integer, Integer> myView = x.tailMap(blockSize * id);
final Integer endK = x.ceilingKey(blockSize * (id + 1));
Integer k = myView.pollFirstEntry().getKey();
do {
k = x.higherKey(k);
if (k == null || k >= endK) {
break;
}
x.remove(k);
} while (true);
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
}
//@Test
@SuppressWarnings("checkstyle:avoidnestedblocks")
public void testSeparateMaps() {
for (int numOutW = 1; numOutW <= 24; numOutW += 1) {
System.out.println("separate maps " + numOutW);
final int unique = 2000000 / numOutW;
final ConcurrentSkipListMap<Integer, Integer>[] x = new ConcurrentSkipListMap[numOutW];
final long instart = System.currentTimeMillis();
{
final AtomicInteger uid = new AtomicInteger(0);
nThreads(numOutW, new Runnable() {
@Override
public void run() {
final ConcurrentSkipListMap<Integer, Integer> mm = new ConcurrentSkipListMap<>();
final int u = uid.getAndIncrement();
x[u] = mm;
for (int i = 0; i < unique; i++) {
mm.put(i, i);
}
}
},
10, TimeUnit.SECONDS);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
final AtomicInteger uid = new AtomicInteger(0);
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
final int id = uid.getAndIncrement();
final ConcurrentSkipListMap<Integer, Integer> mm = x[id];
final Integer startK = mm.pollFirstEntry().getKey();
Integer k = startK;
mm.remove(k);
while ((k = mm.higherKey(k)) != null) {
mm.remove(k);
}
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final int total = unique * numOutW;
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + total + " events in " + inelapsed
+ " seconds (" + ((double) total) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + total + " events in " + outelapsed
+ " seconds (" + ((double) total) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
}
//@Test
public void testPollM() {
final int numOutW = 4;
System.out.println("poll " + numOutW);
final int unique = 2000000;
final ConcurrentSkipListMap<Integer, Integer> x = new ConcurrentSkipListMap<>();
final long instart = System.currentTimeMillis();
for (int i = 0; i < unique; i++) {
x.put(i, i);
}
final long inend = System.currentTimeMillis();
System.gc();
final long outstart = System.currentTimeMillis();
Assert.assertTrue(nThreads(numOutW, new Runnable() {
@Override
public void run() {
Integer k = x.pollFirstEntry().getKey();
x.remove(k);
while ((k = x.higherKey(k)) != null) {
x.remove(k);
}
}
}, 30, TimeUnit.SECONDS));
final long outend = System.currentTimeMillis();
final double inelapsed = ((double) (inend - instart)) / 1000.0;
final double outelapsed = ((double) (outend - outstart)) / 1000.0;
System.out.println("insert " + unique + " events in " + inelapsed
+ " seconds (" + ((double) unique) / (inelapsed * 1000.0 * 1000.0) + " million events/sec)");
System.out.println("output " + unique + " events in " + outelapsed
+ " seconds (" + ((double) unique) / (outelapsed * 1000.0 * 1000.0) + " million events/sec)");
}
}