blob: f13d9b7ac03b80f0e58d1342e354abf6cf68fec9 [file] [log] [blame]
/*
* 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;
}
}