package com.arm.test; import java.util.Random; import org.openjdk.jmh.annotations.*; import java.util.concurrent.TimeUnit; import static java.lang.Math.max; import static java.lang.Math.min; @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Benchmark) public class TestFpMinMaxIntrinsics { private static final int SIZE = 1000; private float[] fnums; private double[] dnums; @Setup(Level.Trial) public void setupArrays() { fnums = new float[SIZE]; dnums = new double[SIZE]; Random random = new Random(0); for (int i = 0; i < SIZE; i++) { fnums[i] = random.nextFloat(); dnums[i] = random.nextDouble(); } } @Benchmark public double findDmax() { double d0 = dnums[0*4]; double d1 = dnums[1*4]; double d2 = dnums[2*4]; double d3 = dnums[3*4]; double d4 = dnums[4*4]; double d5 = dnums[5*4]; double d6 = dnums[6*4]; double d7 = dnums[7*4]; double d8 = dnums[8*4]; double d9 = dnums[9*4]; double d10 = dnums[10*4]; for (int i = 1; i < SIZE; i++) { d5 = max(dnums[i], max(d0, max(d1, max(d2, max(d3, max(d4, max(d5, max(d6, max(d7, max(d8, max(d9, d10))))))))))); double tmp; tmp = d3; d3 = d10; d10 = tmp; tmp = d7; d7 = d9; d9 = tmp; tmp = d8; d8 = d8; d8 = tmp; tmp = d4; d4 = d7; d7 = tmp; tmp = d4; d4 = d6; d6 = tmp; tmp = d5; d5 = d5; d5 = tmp; tmp = d4; d4 = d4; d4 = tmp; tmp = d1; d1 = d3; d3 = tmp; tmp = d1; d1 = d2; d2 = tmp; } return d5; } @Benchmark public double findDmin() { double d0 = dnums[0*4]; double d1 = dnums[1*4]; double d2 = dnums[2*4]; double d3 = dnums[3*4]; double d4 = dnums[4*4]; double d5 = dnums[5*4]; double d6 = dnums[6*4]; double d7 = dnums[7*4]; double d8 = dnums[8*4]; double d9 = dnums[9*4]; double d10 = dnums[10*4]; for (int i = 1; i < SIZE; i++) { d5 = min(dnums[i], min(d0, min(d1, min(d2, min(d3, min(d4, min(d5, min(d6, min(d7, min(d8, min(d9, d10))))))))))); double tmp; tmp = d3; d3 = d10; d10 = tmp; tmp = d7; d7 = d9; d9 = tmp; tmp = d8; d8 = d8; d8 = tmp; tmp = d4; d4 = d7; d7 = tmp; tmp = d4; d4 = d6; d6 = tmp; tmp = d5; d5 = d5; d5 = tmp; tmp = d4; d4 = d4; d4 = tmp; tmp = d1; d1 = d3; d3 = tmp; tmp = d1; d1 = d2; d2 = tmp; } return d5; } @Benchmark public float findFmax() { float f0 = fnums[0*4]; float f1 = fnums[1*4]; float f2 = fnums[2*4]; float f3 = fnums[3*4]; float f4 = fnums[4*4]; float f5 = fnums[5*4]; float f6 = fnums[6*4]; float f7 = fnums[7*4]; float f8 = fnums[8*4]; float f9 = fnums[9*4]; float f10 = fnums[10*4]; for (int i = 1; i < SIZE; i++) { f5 = max(fnums[i], max(f0, max(f1, max(f2, max(f3, max(f4, max(f5, max(f6, max(f7, max(f8, max(f9, f10))))))))))); float tmp; tmp = f3; f3 = f10; f10 = tmp; tmp = f7; f7 = f9; f9 = tmp; tmp = f8; f8 = f8; f8 = tmp; tmp = f4; f4 = f7; f7 = tmp; tmp = f4; f4 = f6; f6 = tmp; tmp = f5; f5 = f5; f5 = tmp; tmp = f4; f4 = f4; f4 = tmp; tmp = f1; f1 = f3; f3 = tmp; tmp = f1; f1 = f2; f2 = tmp; } return f5; } @Benchmark public float findFmin() { float f0 = fnums[0*4]; float f1 = fnums[1*4]; float f2 = fnums[2*4]; float f3 = fnums[3*4]; float f4 = fnums[4*4]; float f5 = fnums[5*4]; float f6 = fnums[6*4]; float f7 = fnums[7*4]; float f8 = fnums[8*4]; float f9 = fnums[9*4]; float f10 = fnums[10*4]; for (int i = 1; i < SIZE; i++) { f5 = min(fnums[i], min(f0, min(f1, min(f2, min(f3, min(f4, min(f5, min(f6, min(f7, min(f8, min(f9, f10))))))))))); float tmp; tmp = f3; f3 = f10; f10 = tmp; tmp = f7; f7 = f9; f9 = tmp; tmp = f8; f8 = f8; f8 = tmp; tmp = f4; f4 = f7; f7 = tmp; tmp = f4; f4 = f6; f6 = tmp; tmp = f5; f5 = f5; f5 = tmp; tmp = f4; f4 = f4; f4 = tmp; tmp = f1; f1 = f3; f3 = tmp; tmp = f1; f1 = f2; f2 = tmp; } return f5; } }