arraybench/src/main/java/com/github/shautvast/multidim/JmhBenchmark.java
2023-08-20 22:32:05 +02:00

152 lines
No EOL
3.8 KiB
Java

package com.github.shautvast.multidim;
import org.openjdk.jmh.annotations.*;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(value = 1)
public class JmhBenchmark {
private static final int ROWS = 1000;
private static final int COLS = 1000;
@org.openjdk.jmh.annotations.State(Scope.Thread)
public static class State {
Int2dArray seqInt2DArray;
IntArray intArray;
int[][] ints;
@Setup(Level.Iteration)
public void doSetup() {
long seed = System.currentTimeMillis();
Random random = new Random(seed);
ints = new int[COLS][ROWS];
intArray = new IntArray(COLS, ROWS);
seqInt2DArray = new Int2dArray(COLS, ROWS);
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
int i = random.nextInt();
intArray.set(r, c, i);
seqInt2DArray.set(r, c, i);
}
}
}
}
@Benchmark
public Int2dArray seq2DArraySetTDLR(State state) {
Int2dArray d2Array = new Int2dArray(ROWS, COLS);
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
d2Array.set(r, c, r * c);
}
}
return d2Array;
}
@Benchmark
public Int2dArray seq2DArraySetLRTD(State state) {
Int2dArray d2Array = new Int2dArray(ROWS, COLS);
for (int c = 0; c < COLS; c++) {
for (int r = 0; r < ROWS; r++) {
d2Array.set(r, c, r * c);
}
}
return d2Array;
}
@Benchmark
public int[][] classicArraySetTDLR(State state) {
int[][] d2Array = new int[ROWS][COLS];
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
d2Array[r][c] = r * c;
}
}
return d2Array;
}
@Benchmark
public int[][] classicArraySetLRTD(State state) {
int[][] d2Array = new int[ROWS][COLS];
for (int c = 0; c < COLS; c++) {
for (int r = 0; r < ROWS; r++) {
d2Array[r][c] = r * c;
}
}
return d2Array;
}
@Benchmark
public int classicArrayGetTDLR(State state) {
int t = 0;
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
t += state.ints[r][c];
}
}
return t;
}
@Benchmark
public int classicArrayGetLRTD(State state) {
int t = 0;
for (int c = 0; c < COLS; c++) {
for (int r = 0; r < ROWS; r++) {
t += state.ints[r][c];
}
}
return t;
}
@Benchmark
public int seq2DArrayGetTDLR(State state) {
int t = 0;
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
t += state.seqInt2DArray.get(r, c);
}
}
return t;
}
@Benchmark
public int seq2DArrayGetLRTD(State state) {
int t = 0;
for (int c = 0; c < COLS; c++) {
for (int r = 0; r < ROWS; r++) {
t += state.seqInt2DArray.get(r, c);
}
}
return t;
}
@Benchmark
public int seqMultArrayGetLRTD(State state) {
int t = 0;
for (int c = 0; c < COLS; c++) {
for (int r = 0; r < ROWS; r++) {
t += state.intArray.get(r, c);
}
}
return t;
}
@Benchmark
public int seqMultArrayGetTDLR(State state) {
int t = 0;
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
t += state.intArray.get(r, c);
}
}
return t;
}
}