• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.google.common.collect;
18 
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.HashSet;
22 import java.util.LinkedHashSet;
23 import java.util.Map;
24 import java.util.Random;
25 import java.util.Set;
26 import java.util.SortedMap;
27 import java.util.TreeSet;
28 import java.util.concurrent.ConcurrentHashMap;
29 
30 /**
31  * Helper classes for various benchmarks.
32  *
33  * @author Christopher Swenson
34  */
35 final 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 {
create(Collection<E> contents)41       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
42         return new HashSet<E>(contents);
43       }
44     },
45     LinkedHash {
create(Collection<E> contents)46       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
47         return new LinkedHashSet<E>(contents);
48       }
49     },
50     Tree {
create(Collection<E> contents)51       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
52         return new TreeSet<E>(contents);
53       }
54     },
55     Unmodifiable {
create(Collection<E> contents)56       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
57         return Collections.unmodifiableSet(new HashSet<E>(contents));
58       }
59     },
60     Synchronized {
create(Collection<E> contents)61       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
62         return Collections.synchronizedSet(new HashSet<E>(contents));
63       }
64     },
65     Immutable {
create(Collection<E> contents)66       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
67         return ImmutableSet.copyOf(contents);
68       }
69     },
70     ImmutableSorted {
create(Collection<E> contents)71       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
72         return ImmutableSortedSet.copyOf(contents);
73       }
74     },
75     ;
76 
create(Collection<E> contents)77     abstract <E extends Comparable<E>> Set<E> create(Collection<E> contents);
78   }
79 
80   public enum ListMultimapImpl {
81     ArrayList {
82       @Override
create(Multimap<K, V> contents)83       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
84         return ArrayListMultimap.create(contents);
85       }
86     },
87     LinkedList {
88       @Override
create(Multimap<K, V> contents)89       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
90         return LinkedListMultimap.create(contents);
91       }
92     },
93     ImmutableList {
94       @Override
create(Multimap<K, V> contents)95       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
96         return ImmutableListMultimap.copyOf(contents);
97       }
98     };
99 
create(Multimap<K, V> contents)100     abstract <K, V> ListMultimap<K, V> create(Multimap<K, V> contents);
101   }
102 
103   public enum SetMultimapImpl {
104     Hash {
105       @Override
create( Multimap<K, V> contents)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
create( Multimap<K, V> contents)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
create( Multimap<K, V> contents)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
create( Multimap<K, V> contents)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 
create( Multimap<K, V> contents)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
create(Map<K, V> map)140       <K, V> Map<K, V> create(Map<K, V> map) {
141         return Maps.newHashMap(map);
142       }
143     },
144     LinkedHash {
145       @Override
create(Map<K, V> map)146       <K, V> Map<K, V> create(Map<K, V> map) {
147         return Maps.newLinkedHashMap(map);
148       }
149     },
150     ConcurrentHash {
151       @Override
create(Map<K, V> map)152       <K, V> Map<K, V> create(Map<K, V> map) {
153         return new ConcurrentHashMap<K, V>(map);
154       }
155     },
156     Immutable {
157       @Override
create(Map<K, V> map)158       <K, V> Map<K, V> create(Map<K, V> map) {
159         return ImmutableMap.copyOf(map);
160       }
161     };
162 
create(Map<K, V> map)163     abstract <K, V> Map<K, V> create(Map<K, V> map);
164   }
165 
166   enum SortedMapImpl {
167     Tree {
168       @Override
create(Map<K, V> map)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
create(Map<K, V> map)177       <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
178         return ImmutableSortedMap.copyOf(map);
179       }
180     };
181 
create(Map<K, V> map)182     abstract <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map);
183   }
184 
185   enum BiMapImpl {
186     Hash{
187       @Override
create(BiMap<K, V> map)188       <K, V> BiMap<K, V> create(BiMap<K, V> map) {
189         return HashBiMap.create(map);
190       }
191     },
192     Immutable {
193       @Override
create(BiMap<K, V> map)194       <K, V> BiMap<K, V> create(BiMap<K, V> map) {
195         return ImmutableBiMap.copyOf(map);
196       }
197     };
198 
create(BiMap<K, V> map)199     abstract <K, V> BiMap<K, V> create(BiMap<K, V> map);
200   }
201 
202   enum MultisetImpl {
203     Hash {
204       @Override
create(Multiset<E> contents)205       <E> Multiset<E> create(Multiset<E> contents) {
206         return HashMultiset.create(contents);
207       }
208     },
209     LinkedHash {
210       @Override
create(Multiset<E> contents)211       <E> Multiset<E> create(Multiset<E> contents) {
212         return LinkedHashMultiset.create(contents);
213       }
214     },
215     ConcurrentHash {
216       @Override
create(Multiset<E> contents)217       <E> Multiset<E> create(Multiset<E> contents) {
218         return ConcurrentHashMultiset.create(contents);
219       }
220     },
221     Immutable {
222       @Override
create(Multiset<E> contents)223       <E> Multiset<E> create(Multiset<E> contents) {
224         return ImmutableMultiset.copyOf(contents);
225       }
226     };
227 
create(Multiset<E> contents)228     abstract <E> Multiset<E> create(Multiset<E> contents);
229   }
230 
231   enum SortedMultisetImpl {
232     Tree {
233       @Override
create(Multiset<E> contents)234       <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
235         return TreeMultiset.create(contents);
236       }
237     },
238     ImmutableSorted {
239       @Override
create(Multiset<E> contents)240       <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
241         return ImmutableSortedMultiset.copyOf(contents);
242       }
243     };
244 
create(Multiset<E> contents)245     abstract <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents);
246   }
247 
248   enum TableImpl {
249     HashBased {
250       @Override
create( Table<R, C, V> contents)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
create( Table<R, C, V> contents)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
create( Table<R, C, V> contents)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
create( Table<R, C, V> contents)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>
create(Table<R, C, V> contents)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 
ListSizeDistribution(int min, int max)298     private ListSizeDistribution(int min, int max) {
299       this.min = min;
300       this.max = max;
301     }
302 
chooseSize(Random random)303     public int chooseSize(Random random) {
304       return random.nextInt(max - min + 1) + min;
305     }
306   }
307 }
308