On Mon, 17 Oct 2022 10:19:26 GMT, Сергей Цыпанов <d...@openjdk.org> wrote:

>> We can use `Comparator.naturalOrder()` for cases when a `TreeMap` instance 
>> is constructed without comparator. This allows to squash two branches in 
>> `TreeMap.get()` into one.
>> 
>> P.S. I think the comment of `TreeMap.getEntryUsingComparator()` is outdated. 
>> Should we also change it?
>
> Сергей Цыпанов has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   8293630: Inline natural()

For the benchmark 

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 15, time = 2, timeUnit = TimeUnit.SECONDS)
@Fork(10)
@State(Scope.Thread)
public class TreeMapGet {

    @Param({"10", "100", "1000", "10000"})
    public int size;

    @Param({"true", "false"})
    public boolean comparator;

    private TreeMap<Integer, Integer> map;
    private Integer[] keys;

    @Setup(Level.Iteration)
    public void setUp() {
        map = comparator ? new TreeMap<>(Comparator.reverseOrder()) : new 
TreeMap<>();
        keys = IntStream.range(0, size).boxed().toArray(Integer[]::new);
        Collections.reverse(Arrays.asList(keys));
        for (Integer key : keys) {
            map.put(key, key);
        }
    }

    @Benchmark
    public void get(Blackhole bh) {
        var keys = this.keys;
        var map = this.map;
        for (Integer key : keys) {
            bh.consume(map.get(key));
        }
    }
}

I got these results:

baseline

Benchmark       (comparator)  (size)  Mode  Cnt       Score      Error  Units
TreeMapGet.get          true      10  avgt  150      69.170 ±    0.886  ns/op
TreeMapGet.get          true     100  avgt  150    1369.488 ±   36.312  ns/op
TreeMapGet.get          true    1000  avgt  150   31462.583 ±  261.650  ns/op
TreeMapGet.get          true   10000  avgt  150  490948.456 ± 3395.402  ns/op
TreeMapGet.get         false      10  avgt  150      69.625 ±    0.975  ns/op
TreeMapGet.get         false     100  avgt  150    1076.163 ±   30.976  ns/op
TreeMapGet.get         false    1000  avgt  150   36528.309 ±  140.245  ns/op
TreeMapGet.get         false   10000  avgt  150  422948.634 ±  976.892  ns/op

patch

Benchmark       (comparator)  (size)  Mode  Cnt       Score      Error  Units
TreeMapGet.get          true      10  avgt  150      68.814 ±    1.221  ns/op
TreeMapGet.get          true     100  avgt  150    1280.799 ±   34.319  ns/op
TreeMapGet.get          true    1000  avgt  150   31530.447 ±  329.406  ns/op
TreeMapGet.get          true   10000  avgt  150  435109.171 ± 1807.717  ns/op
TreeMapGet.get         false      10  avgt  150      65.646 ±    0.124  ns/op
TreeMapGet.get         false     100  avgt  150    1083.535 ±   23.545  ns/op
TreeMapGet.get         false    1000  avgt  150   36299.345 ±  494.126  ns/op
TreeMapGet.get         false   10000  avgt  150  444266.085 ± 2315.616  ns/op

For benchmark

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 15, time = 2, timeUnit = TimeUnit.SECONDS)
@Fork(10)
@State(Scope.Thread)
public class TreeMapEntrySetStream {

    @Param({"10", "100", "1000", "10000"})
    public int size;

    @Param({"true", "false"})
    public boolean comparator;

    private TreeMap<Integer, Integer> map;

    @Setup(Level.Iteration)
    public void setUp() {
        map = comparator ? new TreeMap<>(Comparator.reverseOrder()) : new 
TreeMap<>();
        var keys = IntStream.range(0, size).boxed().toArray(Integer[]::new);
        Collections.reverse(Arrays.asList(keys));
        for (Integer key : keys) {
            map.put(key, key);
        }
    }

    @Benchmark
    public void get(Blackhole bh) {
        var map = this.map;
        map.entrySet().stream().forEach(bh::consume);
    }
}

results are the following:

baseline

Benchmark                  (comparator)  (size)  Mode  Cnt      Score     Error 
 Units
TreeMapEntrySetStream.get          true      10  avgt  150     32.714 ±   0.117 
 ns/op
TreeMapEntrySetStream.get          true     100  avgt  150    271.825 ±   0.596 
 ns/op
TreeMapEntrySetStream.get          true    1000  avgt  150   3267.876 ±  42.650 
 ns/op
TreeMapEntrySetStream.get          true   10000  avgt  150  43207.384 ± 457.110 
 ns/op
TreeMapEntrySetStream.get         false      10  avgt  150     30.863 ±   0.071 
 ns/op
TreeMapEntrySetStream.get         false     100  avgt  150    259.394 ±   0.493 
 ns/op
TreeMapEntrySetStream.get         false    1000  avgt  150   3362.446 ±  44.108 
 ns/op
TreeMapEntrySetStream.get         false   10000  avgt  150  42190.313 ± 421.604 
 ns/op

patch

Benchmark                  (comparator)  (size)  Mode  Cnt      Score     Error 
 Units
TreeMapEntrySetStream.get          true      10  avgt  150     30.856 ±   0.112 
 ns/op
TreeMapEntrySetStream.get          true     100  avgt  150    270.719 ±   0.504 
 ns/op
TreeMapEntrySetStream.get          true    1000  avgt  150   3278.241 ±  41.304 
 ns/op
TreeMapEntrySetStream.get          true   10000  avgt  150  42549.518 ± 427.607 
 ns/op
TreeMapEntrySetStream.get         false      10  avgt  150     31.780 ±   0.092 
 ns/op
TreeMapEntrySetStream.get         false     100  avgt  150    252.551 ±   0.414 
 ns/op
TreeMapEntrySetStream.get         false    1000  avgt  150   3359.962 ±  44.337 
 ns/op
TreeMapEntrySetStream.get         false   10000  avgt  150  41613.570 ± 381.721 
 ns/op

-------------

PR: https://git.openjdk.org/jdk/pull/9901

Reply via email to