On Wed, 19 Jul 2023 13:14:23 GMT, Pavel Rappo <pra...@openjdk.org> wrote:
>> Please review this PR to refactor Arrays.hashCode for long[], boolean[], and >> Object[]. I've been told elsewhere that it shouldn't have significant >> performance implications. > > Pavel Rappo has updated the pull request incrementally with one additional > commit since the last revision: > > Fix hashCode(float[]) I ran a JMH benchmark for this PR: @Warmup(iterations = 5, time = 3) @Measurement(iterations = 5, time = 2) @Fork(value = 1, jvmArgsAppend = {"-XX:+UseG1GC", "-Xms8g", "-Xmx8g"}) @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) public class HashCode { @Param({"1", "10", "100", "10000"}) private int size; private long[] longs; private boolean[] booleans; private float[] floats; private double[] doubles; private Object[] objects; @Setup public void setup() { longs = new long[size]; booleans = new boolean[size]; floats = new float[size]; doubles = new double[size]; objects = new Object[size]; Random rnd = new Random(0); for (int i = 0; i < size; i++) { long next = rnd.nextLong(); longs[i] = next; booleans[i] = next % 2 == 0; floats[i] = Float.intBitsToFloat((int) next); doubles[i] = Double.longBitsToDouble(next); objects[i] = (int) next; } } @Benchmark public int longs() { return Arrays.hashCode(longs); } @Benchmark public int booleans() { return Arrays.hashCode(booleans); } @Benchmark public int floats() { return Arrays.hashCode(floats); } @Benchmark public int doubles() { return Arrays.hashCode(doubles); } @Benchmark public int objects() { return Arrays.hashCode(objects); } } Result: (This PR) (Baseline) Benchmark (size) Mode Cnt Score Error Units Score Error Units HashCode.booleans 1 thrpt 5 472358.594 ± 5037.260 ops/ms 473356.084 ± 1780.600 ops/ms HashCode.booleans 10 thrpt 5 118457.276 ± 848.886 ops/ms 118470.818 ± 342.023 ops/ms HashCode.booleans 100 thrpt 5 13140.346 ± 46.869 ops/ms 13153.643 ± 1.226 ops/ms HashCode.booleans 10000 thrpt 5 133.090 ± 0.027 ops/ms 133.041 ± 0.032 ops/ms HashCode.doubles 1 thrpt 5 438869.947 ± 1806.730 ops/ms 441611.989 ± 692.622 ops/ms HashCode.doubles 10 thrpt 5 76418.134 ± 42.834 ops/ms 76432.141 ± 368.953 ops/ms HashCode.doubles 100 thrpt 5 7364.920 ± 6.941 ops/ms 7339.776 ± 28.448 ops/ms HashCode.doubles 10000 thrpt 5 76.689 ± 0.037 ops/ms 76.787 ± 0.188 ops/ms HashCode.floats 1 thrpt 5 443741.068 ± 1773.736 ops/ms 444085.364 ± 557.545 ops/ms HashCode.floats 10 thrpt 5 86047.878 ± 306.709 ops/ms 86306.681 ± 908.752 ops/ms HashCode.floats 100 thrpt 5 8263.785 ± 37.091 ops/ms 8254.055 ± 3.427 ops/ms HashCode.floats 10000 thrpt 5 86.146 ± 0.018 ops/ms 86.121 ± 0.022 ops/ms HashCode.longs 1 thrpt 5 462198.590 ± 27224.002 ops/ms 460673.957 ± 26979.630 ops/ms HashCode.longs 10 thrpt 5 124744.207 ± 262.268 ops/ms 130367.753 ± 257.766 ops/ms HashCode.longs 100 thrpt 5 13552.607 ± 2.545 ops/ms 13454.362 ± 8.991 ops/ms HashCode.longs 10000 thrpt 5 133.122 ± 0.038 ops/ms 133.114 ± 0.016 ops/ms HashCode.objects 1 thrpt 5 230303.967 ± 919.637 ops/ms 647597.213 ± 2652.002 ops/ms HashCode.objects 10 thrpt 5 25724.486 ± 111.422 ops/ms 121222.501 ± 270.073 ops/ms HashCode.objects 100 thrpt 5 2497.018 ± 6.201 ops/ms 11889.717 ± 264.730 ops/ms HashCode.objects 10000 thrpt 5 27.673 ± 0.012 ops/ms 130.903 ± 0.714 ops/ms I think there is a performance issue with this PR. For object arrays, the performance is reduced by about 80%. (I got the result reversed in a previous comment, so I hid it.) ------------- PR Review: https://git.openjdk.org/jdk/pull/14900#pullrequestreview-1538245804