• 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 import java.util.concurrent.ConcurrentSkipListMap;
30 
31 /**
32  * Helper classes for various benchmarks.
33  *
34  * @author Christopher Swenson
35  */
36 final class BenchmarkHelpers {
37   /**
38    * So far, this is the best way to test various implementations of {@link Set} subclasses.
39    */
40   public enum SetImpl {
41     Hash {
create(Collection<E> contents)42       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
43         return new HashSet<E>(contents);
44       }
45     },
46     LinkedHash {
create(Collection<E> contents)47       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
48         return new LinkedHashSet<E>(contents);
49       }
50     },
51     Tree {
create(Collection<E> contents)52       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
53         return new TreeSet<E>(contents);
54       }
55     },
56     Unmodifiable {
create(Collection<E> contents)57       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
58         return Collections.unmodifiableSet(new HashSet<E>(contents));
59       }
60     },
61     Synchronized {
create(Collection<E> contents)62       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
63         return Collections.synchronizedSet(new HashSet<E>(contents));
64       }
65     },
66     Immutable {
create(Collection<E> contents)67       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
68         return ImmutableSet.copyOf(contents);
69       }
70     },
71     ImmutableSorted {
create(Collection<E> contents)72       @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
73         return ImmutableSortedSet.copyOf(contents);
74       }
75     },
76     ;
77 
create(Collection<E> contents)78     abstract <E extends Comparable<E>> Set<E> create(Collection<E> contents);
79   }
80 
81   public enum ListMultimapImpl {
82     ArrayList {
83       @Override
create(Multimap<K, V> contents)84       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
85         return ArrayListMultimap.create(contents);
86       }
87     },
88     LinkedList {
89       @Override
create(Multimap<K, V> contents)90       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
91         return LinkedListMultimap.create(contents);
92       }
93     },
94     ImmutableList {
95       @Override
create(Multimap<K, V> contents)96       <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
97         return ImmutableListMultimap.copyOf(contents);
98       }
99     };
100 
create(Multimap<K, V> contents)101     abstract <K, V> ListMultimap<K, V> create(Multimap<K, V> contents);
102   }
103 
104   public enum SetMultimapImpl {
105     Hash {
106       @Override
create( Multimap<K, V> contents)107       <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
108           Multimap<K, V> contents) {
109         return HashMultimap.create(contents);
110       }
111     },
112     LinkedHash {
113       @Override
create( Multimap<K, V> contents)114       <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
115           Multimap<K, V> contents) {
116         return LinkedHashMultimap.create(contents);
117       }
118     },
119     Tree {
120       @Override
create( Multimap<K, V> contents)121       <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
122           Multimap<K, V> contents) {
123         return TreeMultimap.create(contents);
124       }
125     },
126     ImmutableSet {
127       @Override
create( Multimap<K, V> contents)128       <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
129           Multimap<K, V> contents) {
130         return ImmutableSetMultimap.copyOf(contents);
131       }
132     };
133 
create( Multimap<K, V> contents)134     abstract <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
135         Multimap<K, V> contents);
136   }
137 
138   public enum MapImpl {
139     Hash {
140       @Override
create(Map<K, V> map)141       <K, V> Map<K, V> create(Map<K, V> map) {
142         return Maps.newHashMap(map);
143       }
144     },
145     LinkedHash {
146       @Override
create(Map<K, V> map)147       <K, V> Map<K, V> create(Map<K, V> map) {
148         return Maps.newLinkedHashMap(map);
149       }
150     },
151     ConcurrentHash {
152       @Override
create(Map<K, V> map)153       <K, V> Map<K, V> create(Map<K, V> map) {
154         return new ConcurrentHashMap<K, V>(map);
155       }
156     },
157     Immutable {
158       @Override
create(Map<K, V> map)159       <K, V> Map<K, V> create(Map<K, V> map) {
160         return ImmutableMap.copyOf(map);
161       }
162     };
163 
create(Map<K, V> map)164     abstract <K, V> Map<K, V> create(Map<K, V> map);
165   }
166 
167   enum SortedMapImpl {
168     Tree {
169       @Override
create(Map<K, V> map)170       <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
171         SortedMap<K, V> result = Maps.newTreeMap();
172         result.putAll(map);
173         return result;
174       }
175     },
176     ConcurrentSkipList {
177       @Override
create(Map<K, V> map)178       <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
179         return new ConcurrentSkipListMap<K, V>(map);
180       }
181     },
182     ImmutableSorted {
183       @Override
create(Map<K, V> map)184       <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
185         return ImmutableSortedMap.copyOf(map);
186       }
187     };
188 
create(Map<K, V> map)189     abstract <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map);
190   }
191 
192   enum BiMapImpl {
193     Hash{
194       @Override
create(BiMap<K, V> map)195       <K, V> BiMap<K, V> create(BiMap<K, V> map) {
196         return HashBiMap.create(map);
197       }
198     },
199     Immutable {
200       @Override
create(BiMap<K, V> map)201       <K, V> BiMap<K, V> create(BiMap<K, V> map) {
202         return ImmutableBiMap.copyOf(map);
203       }
204     };
205 
create(BiMap<K, V> map)206     abstract <K, V> BiMap<K, V> create(BiMap<K, V> map);
207   }
208 
209   enum MultisetImpl {
210     Hash {
211       @Override
create(Multiset<E> contents)212       <E> Multiset<E> create(Multiset<E> contents) {
213         return HashMultiset.create(contents);
214       }
215     },
216     LinkedHash {
217       @Override
create(Multiset<E> contents)218       <E> Multiset<E> create(Multiset<E> contents) {
219         return LinkedHashMultiset.create(contents);
220       }
221     },
222     ConcurrentHash {
223       @Override
create(Multiset<E> contents)224       <E> Multiset<E> create(Multiset<E> contents) {
225         return ConcurrentHashMultiset.create(contents);
226       }
227     },
228     Immutable {
229       @Override
create(Multiset<E> contents)230       <E> Multiset<E> create(Multiset<E> contents) {
231         return ImmutableMultiset.copyOf(contents);
232       }
233     };
234 
create(Multiset<E> contents)235     abstract <E> Multiset<E> create(Multiset<E> contents);
236   }
237 
238   enum SortedMultisetImpl {
239     Tree {
240       @Override
create(Multiset<E> contents)241       <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
242         return TreeMultiset.create(contents);
243       }
244     },
245     ImmutableSorted {
246       @Override
create(Multiset<E> contents)247       <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
248         return ImmutableSortedMultiset.copyOf(contents);
249       }
250     };
251 
create(Multiset<E> contents)252     abstract <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents);
253   }
254 
255   enum TableImpl {
256     HashBased {
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         return HashBasedTable.create(contents);
261       }
262     },
263     TreeBased {
264       @Override
create( Table<R, C, V> contents)265       <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
266           Table<R, C, V> contents) {
267         Table<R, C, V> table = TreeBasedTable.create();
268         table.putAll(contents);
269         return table;
270       }
271     },
272     Array {
273       @Override
create( Table<R, C, V> contents)274       <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
275           Table<R, C, V> contents) {
276         if (contents.isEmpty()) {
277           return ImmutableTable.of();
278         } else {
279           return ArrayTable.create(contents);
280         }
281       }
282     },
283     Immutable {
284       @Override
create( Table<R, C, V> contents)285       <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
286           Table<R, C, V> contents) {
287         return ImmutableTable.copyOf(contents);
288       }
289     };
290 
291     abstract <R extends Comparable<R>, C extends Comparable<C>, V>
create(Table<R, C, V> contents)292         Table<R, C, V> create(Table<R, C, V> contents);
293   }
294 
295   public enum Value {
296     INSTANCE;
297   }
298 
299   public enum ListSizeDistribution {
300     UNIFORM_0_TO_2(0, 2), UNIFORM_0_TO_9(0, 9), ALWAYS_0(0, 0), ALWAYS_10(10, 10);
301 
302     final int min;
303     final int max;
304 
ListSizeDistribution(int min, int max)305     private ListSizeDistribution(int min, int max) {
306       this.min = min;
307       this.max = max;
308     }
309 
chooseSize(Random random)310     public int chooseSize(Random random) {
311       return random.nextInt(max - min + 1) + min;
312     }
313   }
314 }
315