Package java_perf.s38system_benchmarks

Source Code of java_perf.s38system_benchmarks.FalseSharingTest

package java_perf.s38system_benchmarks;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;

import org.junit.Before;
import org.junit.Test;

import com.carrotsearch.junitbenchmarks.AbstractBenchmark;

public final class FalseSharingTest extends AbstractBenchmark {
  private final static int THREAD_COUNT = 2;
  private final static int ITERATIONS = 10000000;

  private AtomicInteger atomicIntegers[];
  private AtomicIntegerArray atomicIntegerArray;
  private ExecutorService executor;

  @Test
  public void testNonShared() throws Exception {
    for (int j = 0; j < THREAD_COUNT; ++j) {
      final int k = j;
      executor.submit(new Runnable() {
        @Override
        public void run() {
          for (int i = 0; i < ITERATIONS; ++i) {
            atomicIntegers[k].incrementAndGet();
          }
        }
      });
    }

    executor.shutdown();
    assertTrue(executor.awaitTermination(THREAD_COUNT, TimeUnit.MINUTES));

    for (int i = 0; i < THREAD_COUNT; ++i) {
      assertEquals(ITERATIONS, atomicIntegers[i].get());
    }
  }

  @Test
  public void testShared() throws Exception {
    for (int j = 0; j < THREAD_COUNT; ++j) {
      final int k = j;
      executor.submit(new Runnable() {
        @Override
        public void run() {
          for (int i = 0; i < ITERATIONS; ++i) {
            atomicIntegerArray.incrementAndGet(k);
          }
        }
      });
    }

    executor.shutdown();
    assertTrue(executor.awaitTermination(THREAD_COUNT, TimeUnit.MINUTES));

    for (int i = 0; i < THREAD_COUNT; ++i) {
      assertEquals(ITERATIONS, atomicIntegerArray.get(i));
    }
  }

  private int getRemainder() {
    return ITERATIONS % THREAD_COUNT;
  }

  @Before
  public void setUp() {
    assertTrue(Runtime.getRuntime().availableProcessors() >= THREAD_COUNT);
    assertTrue(getRemainder() == 0);

    executor = Executors.newCachedThreadPool();
    atomicIntegers = new AtomicInteger[THREAD_COUNT];
    for (int i = 0; i < atomicIntegers.length; ++i) {
      atomicIntegers[i] = new AtomicInteger(0);
    }

    atomicIntegerArray = new AtomicIntegerArray(new int[THREAD_COUNT]);
  }
}
TOP

Related Classes of java_perf.s38system_benchmarks.FalseSharingTest

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.