/* * Copyright (C) 2017 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.collect; import static com.google.common.base.Functions.toStringFunction; import static com.google.common.collect.Maps.uniqueIndex; import com.google.caliper.BeforeExperiment; import com.google.caliper.Benchmark; import com.google.caliper.Param; import com.google.caliper.api.Footprint; import com.google.common.collect.BenchmarkHelpers.BiMapImpl; import com.google.common.collect.BenchmarkHelpers.MapImpl; import com.google.common.collect.BenchmarkHelpers.MapsImplEnum; import com.google.common.collect.BenchmarkHelpers.SortedMapImpl; import com.google.common.collect.CollectionBenchmarkSampleData.Element; import java.util.Arrays; import java.util.Map; /** Benchmarks for memory consumption of map implementations. */ public class MapsMemoryBenchmark { static final Map<String, MapsImplEnum> mapEnums = uniqueIndex( Iterables.<MapsImplEnum>concat( Arrays.asList(MapImpl.values()), Arrays.asList(SortedMapImpl.values()), Arrays.asList(BiMapImpl.values())), toStringFunction()); @Param({ "HashMapImpl", "LinkedHashMapImpl", "ConcurrentHashMapImpl", "ImmutableMapImpl", "TreeMapImpl", "ImmutableSortedMapImpl", "MapMakerWeakKeysWeakValues", "MapMakerWeakKeysStrongValues", "MapMakerStrongKeysWeakValues", "MapMakerStrongKeysStrongValues", "HashBiMapImpl", "ImmutableBiMapImpl" }) String implName; MapsImplEnum mapsImpl; /** * A map of contents pre-created before experiment starts to only measure map creation cost. * The implementation for the creation of contents is independent and could be different from * that of the map under test. */ Map<Element, Element> contents; /** * Map pre-created before experiment starts to only measure iteration cost during experiment. */ Map<Element, Element> map; CollectionBenchmarkSampleData elems; @Param({"0", "1", "100", "10000"}) int elements; @BeforeExperiment public void prepareContents() throws Exception { mapsImpl = mapEnums.get(implName); elems = new CollectionBenchmarkSampleData(elements); contents = Maps.newHashMap(); for (Element key : elems.getValuesInSet()) { contents.put(key, key); } map = mapsImpl.create(contents); } @Benchmark @Footprint(exclude = Element.class) public Map<Element, Element> create() throws Exception { return mapsImpl.create(contents); } @Benchmark public int iterate() { long retVal = 0; for (Object entry : map.entrySet()) { retVal += entry.hashCode(); } return (int) retVal; } @Benchmark public int keyIterate() { long retVal = 0; for (Object key : map.keySet()) { retVal += key.hashCode(); } return (int) retVal; } }