import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
public class Main {
static int SEQ_THRESHOLD;
public static void main(String[] args) throws Exception {
int size = 100000;
int[] v1 = new int[size];
for (int i = 0; i < size; i++) {
v1[i] = i;
}
for (SEQ_THRESHOLD = 10; SEQ_THRESHOLD < size; SEQ_THRESHOLD += 50) {
double avgTime = 0.0;
int samples = 5;
for (int i = 0; i < samples; i++) {
long startTime = System.nanoTime();
ForkJoinPool fjp = new ForkJoinPool();
fjp.invoke(new MyAction(0, size, v1));
long endTime = System.nanoTime();
double secsTaken = (endTime - startTime) / 1.0e9;
avgTime += secsTaken;
}
System.out.println(SEQ_THRESHOLD + " " + (avgTime / samples));
}
}
}
class MyAction extends RecursiveAction {
int[] v1;
int start, end;
MyAction(int start, int end, int[] v1) {
this.start = start;
this.end = end;
this.v1 = v1;
}
int SEQ_THRESHOLD = Main.SEQ_THRESHOLD;
@Override
protected void compute() {
if (end - start < SEQ_THRESHOLD) {
for (int i = start; i < end; i++) {
v1[i] = v1[i] + i * i;
}
} else {
int mid = (start + end) / 2;
invokeAll(new MyAction(start, mid, v1), new MyAction(mid, end, v1));
}
}
}