import java.util.Random;
class CpuCycles {
public static void main(String[] args) {
final int arraySize = 1024*4;
final int iterationMax = 1000;
final short[] array = new short[arraySize];
if (info.yeppp.Library.isSupported(info.yeppp.CpuSystemFeature.CycleCounter)) {
long minOverhead = ulongMax();
for (int iteration = 0; iteration < iterationMax; iteration++) {
final info.yeppp.CpuCycleCounterState state = info.yeppp.Library.acquireCycleCounter();
final long cycles = info.yeppp.Library.releaseCycleCounter(state);
minOverhead = minu(minOverhead, cycles);
}
long minCycles = ulongMax();
for (int iteration = 0; iteration < iterationMax; iteration++) {
final info.yeppp.CpuCycleCounterState state = info.yeppp.Library.acquireCycleCounter();
final Random rng = new Random(42l);
for (int i = 0; i < arraySize; i++) {
array[i] = (short)rng.nextInt();
}
final long cycles = info.yeppp.Library.releaseCycleCounter(state);
minCycles = minu(minCycles, cycles);
}
final double cpe = ulongToDouble(minCycles - minOverhead) / ((double)arraySize);
System.out.println(String.format("Cycles per element: %3.2f", cpe));
} else {
System.out.println("Processor cycle counter is not supported");
}
}
private static long ulongMax() {
return 0xFFFFFFFFFFFFFFFFL;
}
private static long minu(long a, long b) {
if ((a ^ 0x8000000000000000L) < (b ^ 0x8000000000000000L)) {
return a;
} else {
return b;
}
}
private static double ulongToDouble(long n) {
return (double)(n & 0x7FFFFFFFFFFFFFFFL) - (double)(n & 0x8000000000000000L);
}
}