/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.db.tests.performance.java; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import org.simantics.db.testing.base.TestCommonPerf; /** * */ public class SynchronizationTest extends TestCommonPerf { // public void test() throws Exception { // // class CounterThread extends Thread { // // final private Semaphore start; // final private AtomicInteger counter; // final private CountDownLatch latch; // // public CounterThread(Semaphore start, CountDownLatch latch, AtomicInteger counter) { // this.start = start; // this.counter = counter; // this.latch = latch; // } // // @Override // public void run() { // // try { // start.acquire(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // // int work = 0; // for(int i=0;i<10000000;i++) { // counter.incrementAndGet(); // for(int j=0;j<100;j++) work++; // counter.decrementAndGet(); // } // // latch.countDown(); // // System.out.println("work=" + work); // // } // // } // // CountDownLatch latch = new CountDownLatch(8); // AtomicInteger counter = new AtomicInteger(0); // Semaphore starter = new Semaphore(0); // // for(int i=0;i<8;i++) new CounterThread(starter, latch, counter).start(); // // Thread.sleep(500); // // starter.release(8); // long start = System.nanoTime(); // latch.await(); // long duration = System.nanoTime() - start; // // System.out.println("counter=" + counter.get()); // // System.out.println("Finished in " + 1e-9*duration + "s."); // // } // // public void test2() throws Exception { // // class CounterThread extends Thread { // // final private int index; // final private Semaphore start; // final private AtomicIntegerArray counter; // final private CountDownLatch latch; // // public CounterThread(int index, Semaphore start, CountDownLatch latch, AtomicIntegerArray counter) { // this.index = index; // this.start = start; // this.counter = counter; // this.latch = latch; // } // // @Override // public void run() { // // try { // start.acquire(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // // for(int i=0;i<50000000;i++) { // counter.incrementAndGet(index); // } // // latch.countDown(); // // } // // } // // CountDownLatch latch = new CountDownLatch(4); // AtomicIntegerArray counter = new AtomicIntegerArray(4); // Semaphore starter = new Semaphore(0); // // for(int i=0;i<4;i++) new CounterThread(i, starter, latch, counter).start(); // // Thread.sleep(500); // // starter.release(4); // long start = System.nanoTime(); // latch.await(); // long duration = System.nanoTime() - start; // // //System.out.println("counter=" + counter.get()); // // System.out.println("[counter=" + counter + "]: Finished in " + 1e-9*duration + "s."); // // } // // public void test3() throws Exception { // // class CounterThread extends Thread { // // final private int index; // final private Semaphore start; // final private AtomicInteger counter; // final private CountDownLatch latch; // // public CounterThread(int index, Semaphore start, CountDownLatch latch, AtomicInteger counter) { // this.index = index; // this.start = start; // this.counter = counter; // this.latch = latch; // } // // @Override // public void run() { // // try { // start.acquire(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // // for(int i=0;i<50000000;i++) { // counter.incrementAndGet(); // } // // latch.countDown(); // // } // // } // // CountDownLatch latch = new CountDownLatch(4); // AtomicInteger counter = new AtomicInteger(0); // Semaphore starter = new Semaphore(0); // // for(int i=0;i<4;i++) new CounterThread(i, starter, latch, counter).start(); // // Thread.sleep(500); // // starter.release(4); // long start = System.nanoTime(); // latch.await(); // long duration = System.nanoTime() - start; // // //System.out.println("counter=" + counter.get()); // // System.out.println("[counter=" + counter + "]: Finished in " + 1e-9*duration + "s."); // // } public void test4() throws Exception { int size = 50000000; for(int i=0;i<2;i++) { runTest3(1, size, 4); runTest3(2, size, 4); runTest3(4, size, 4); runTest3(8, size, 4); runTest3(16, size, 4); runTest3(32, size, 4); runTest3(64, size, 4); runTest3(128, size, 4); runTest3(256, size, 4); runTest3(512, size, 4); } } private void runTest3(final int STRIPE, final int size, final int threads) throws Exception { final int[] work = new int[STRIPE*threads]; class CounterThread extends Thread { final private int index; final private Semaphore start; final private CountDownLatch latch; public CounterThread(int index, Semaphore start, CountDownLatch latch) { this.index = index; this.start = start; this.latch = latch; } @Override public void run() { try { start.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } int offset = STRIPE*index; for(int i=0;i