--- /dev/null
+package org.simantics.db.impl;\r
+\r
+import java.util.ArrayList;\r
+import java.util.concurrent.BlockingQueue;\r
+import java.util.concurrent.ConcurrentLinkedQueue;\r
+import java.util.concurrent.CountDownLatch;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+import java.util.concurrent.atomic.AtomicInteger;\r
+import java.util.concurrent.locks.ReentrantLock;\r
+\r
+public class PerformanceTests {\r
+\r
+ \r
+ public static void collectionTest1() {\r
+\r
+ final BlockingQueue<Object> queue = new LinkedBlockingQueue<Object>();\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) queue.add(this);\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ start = System.nanoTime();\r
+ ArrayList<Object> sink = new ArrayList<Object>();\r
+ queue.drainTo(sink);\r
+ done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+ \r
+ public static void collectionTest2() {\r
+\r
+ final ConcurrentLinkedQueue<Object> queue = new ConcurrentLinkedQueue<Object>();\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) queue.add(this);\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ start = System.nanoTime();\r
+ ArrayList<Object> sink = new ArrayList<Object>();\r
+ for(Object o : queue) sink.add(o);\r
+ done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+\r
+ public static void collectionTest3() {\r
+\r
+ final ArrayList<Object> queue = new ArrayList<Object>();\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) {\r
+ synchronized(queue) {\r
+ queue.add(this);\r
+ }\r
+ }\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ start = System.nanoTime();\r
+ ArrayList<Object> sink = new ArrayList<Object>();\r
+ sink.addAll(queue);\r
+ done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+\r
+ public static void collectionTest4() {\r
+\r
+ final ArrayList<Object> queue = new ArrayList<Object>();\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ final ReentrantLock lock = new ReentrantLock();\r
+ final ReentrantLock lock2 = new ReentrantLock();\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) {\r
+ lock.lock();\r
+ queue.add(this);\r
+ lock.unlock();\r
+ lock2.tryLock();\r
+ }\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ start = System.nanoTime();\r
+ ArrayList<Object> sink = new ArrayList<Object>();\r
+ sink.addAll(queue);\r
+ done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+\r
+ public static void counterTest1() {\r
+\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ final AtomicInteger integer = new AtomicInteger();\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) {\r
+ integer.incrementAndGet();\r
+ }\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+\r
+ static int counter = 0;\r
+ \r
+ public static void counterTest2() {\r
+\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ final ReentrantLock lock = new ReentrantLock();\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) {\r
+ lock.lock();\r
+ counter++;\r
+ lock.unlock();\r
+ }\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+\r
+ public static void counterTest3() {\r
+\r
+ final CountDownLatch latch1 = new CountDownLatch(9);\r
+ final CountDownLatch latch2 = new CountDownLatch(9);\r
+ //final ReentrantLock lock = new ReentrantLock();\r
+ \r
+ class T extends Thread {\r
+\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ for(int i=0;i<500000;i++) {\r
+ //lock.lock();\r
+ counter++;\r
+ //lock.unlock();\r
+ }\r
+ try {\r
+ latch2.countDown();\r
+ latch2.await();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+ for(int i=0;i<8;i++) new T().start();\r
+ \r
+ try {\r
+ latch1.countDown();\r
+ latch1.await();\r
+ long start = System.nanoTime();\r
+ latch2.countDown();\r
+ latch2.await();\r
+ long done = System.nanoTime() - start;\r
+ System.out.println("took " + 1e-9*done);\r
+ \r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ \r
+ }\r
+ \r
+ public static void main(String[] args) {\r
+// collectionTest1();\r
+// collectionTest2();\r
+// collectionTest3();\r
+// collectionTest4();\r
+ counterTest3();\r
+ }\r
+ \r
+}\r