1/* 2 * Copyright (C) 2012 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.google.common.collect; 18 19import java.util.Collection; 20import java.util.Collections; 21import java.util.HashSet; 22import java.util.LinkedHashSet; 23import java.util.Map; 24import java.util.Random; 25import java.util.Set; 26import java.util.SortedMap; 27import java.util.TreeSet; 28import java.util.concurrent.ConcurrentHashMap; 29 30/** 31 * Helper classes for various benchmarks. 32 * 33 * @author Christopher Swenson 34 */ 35final class BenchmarkHelpers { 36 /** 37 * So far, this is the best way to test various implementations of {@link Set} subclasses. 38 */ 39 public enum SetImpl { 40 Hash { 41 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 42 return new HashSet<E>(contents); 43 } 44 }, 45 LinkedHash { 46 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 47 return new LinkedHashSet<E>(contents); 48 } 49 }, 50 Tree { 51 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 52 return new TreeSet<E>(contents); 53 } 54 }, 55 Unmodifiable { 56 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 57 return Collections.unmodifiableSet(new HashSet<E>(contents)); 58 } 59 }, 60 Synchronized { 61 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 62 return Collections.synchronizedSet(new HashSet<E>(contents)); 63 } 64 }, 65 Immutable { 66 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 67 return ImmutableSet.copyOf(contents); 68 } 69 }, 70 ImmutableSorted { 71 @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) { 72 return ImmutableSortedSet.copyOf(contents); 73 } 74 }, 75 ; 76 77 abstract <E extends Comparable<E>> Set<E> create(Collection<E> contents); 78 } 79 80 public enum ListMultimapImpl { 81 ArrayList { 82 @Override 83 <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) { 84 return ArrayListMultimap.create(contents); 85 } 86 }, 87 LinkedList { 88 @Override 89 <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) { 90 return LinkedListMultimap.create(contents); 91 } 92 }, 93 ImmutableList { 94 @Override 95 <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) { 96 return ImmutableListMultimap.copyOf(contents); 97 } 98 }; 99 100 abstract <K, V> ListMultimap<K, V> create(Multimap<K, V> contents); 101 } 102 103 public enum SetMultimapImpl { 104 Hash { 105 @Override 106 <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create( 107 Multimap<K, V> contents) { 108 return HashMultimap.create(contents); 109 } 110 }, 111 LinkedHash { 112 @Override 113 <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create( 114 Multimap<K, V> contents) { 115 return LinkedHashMultimap.create(contents); 116 } 117 }, 118 Tree { 119 @Override 120 <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create( 121 Multimap<K, V> contents) { 122 return TreeMultimap.create(contents); 123 } 124 }, 125 ImmutableSet { 126 @Override 127 <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create( 128 Multimap<K, V> contents) { 129 return ImmutableSetMultimap.copyOf(contents); 130 } 131 }; 132 133 abstract <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create( 134 Multimap<K, V> contents); 135 } 136 137 public enum MapImpl { 138 Hash { 139 @Override 140 <K, V> Map<K, V> create(Map<K, V> map) { 141 return Maps.newHashMap(map); 142 } 143 }, 144 LinkedHash { 145 @Override 146 <K, V> Map<K, V> create(Map<K, V> map) { 147 return Maps.newLinkedHashMap(map); 148 } 149 }, 150 ConcurrentHash { 151 @Override 152 <K, V> Map<K, V> create(Map<K, V> map) { 153 return new ConcurrentHashMap<K, V>(map); 154 } 155 }, 156 Immutable { 157 @Override 158 <K, V> Map<K, V> create(Map<K, V> map) { 159 return ImmutableMap.copyOf(map); 160 } 161 }; 162 163 abstract <K, V> Map<K, V> create(Map<K, V> map); 164 } 165 166 enum SortedMapImpl { 167 Tree { 168 @Override 169 <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) { 170 SortedMap<K, V> result = Maps.newTreeMap(); 171 result.putAll(map); 172 return result; 173 } 174 }, 175 ImmutableSorted { 176 @Override 177 <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) { 178 return ImmutableSortedMap.copyOf(map); 179 } 180 }; 181 182 abstract <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map); 183 } 184 185 enum BiMapImpl { 186 Hash{ 187 @Override 188 <K, V> BiMap<K, V> create(BiMap<K, V> map) { 189 return HashBiMap.create(map); 190 } 191 }, 192 Immutable { 193 @Override 194 <K, V> BiMap<K, V> create(BiMap<K, V> map) { 195 return ImmutableBiMap.copyOf(map); 196 } 197 }; 198 199 abstract <K, V> BiMap<K, V> create(BiMap<K, V> map); 200 } 201 202 enum MultisetImpl { 203 Hash { 204 @Override 205 <E> Multiset<E> create(Multiset<E> contents) { 206 return HashMultiset.create(contents); 207 } 208 }, 209 LinkedHash { 210 @Override 211 <E> Multiset<E> create(Multiset<E> contents) { 212 return LinkedHashMultiset.create(contents); 213 } 214 }, 215 ConcurrentHash { 216 @Override 217 <E> Multiset<E> create(Multiset<E> contents) { 218 return ConcurrentHashMultiset.create(contents); 219 } 220 }, 221 Immutable { 222 @Override 223 <E> Multiset<E> create(Multiset<E> contents) { 224 return ImmutableMultiset.copyOf(contents); 225 } 226 }; 227 228 abstract <E> Multiset<E> create(Multiset<E> contents); 229 } 230 231 enum SortedMultisetImpl { 232 Tree { 233 @Override 234 <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) { 235 return TreeMultiset.create(contents); 236 } 237 }, 238 ImmutableSorted { 239 @Override 240 <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) { 241 return ImmutableSortedMultiset.copyOf(contents); 242 } 243 }; 244 245 abstract <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents); 246 } 247 248 enum TableImpl { 249 HashBased { 250 @Override 251 <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create( 252 Table<R, C, V> contents) { 253 return HashBasedTable.create(contents); 254 } 255 }, 256 TreeBased { 257 @Override 258 <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create( 259 Table<R, C, V> contents) { 260 Table<R, C, V> table = TreeBasedTable.create(); 261 table.putAll(contents); 262 return table; 263 } 264 }, 265 Array { 266 @Override 267 <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create( 268 Table<R, C, V> contents) { 269 if (contents.isEmpty()) { 270 return ImmutableTable.of(); 271 } else { 272 return ArrayTable.create(contents); 273 } 274 } 275 }, 276 Immutable { 277 @Override 278 <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create( 279 Table<R, C, V> contents) { 280 return ImmutableTable.copyOf(contents); 281 } 282 }; 283 284 abstract <R extends Comparable<R>, C extends Comparable<C>, V> 285 Table<R, C, V> create(Table<R, C, V> contents); 286 } 287 288 public enum Value { 289 INSTANCE; 290 } 291 292 public enum ListSizeDistribution { 293 UNIFORM_0_TO_2(0, 2), UNIFORM_0_TO_9(0, 9), ALWAYS_0(0, 0), ALWAYS_10(10, 10); 294 295 final int min; 296 final int max; 297 298 private ListSizeDistribution(int min, int max) { 299 this.min = min; 300 this.max = max; 301 } 302 303 public int chooseSize(Random random) { 304 return random.nextInt(max - min + 1) + min; 305 } 306 } 307} 308