/*
* Copyright (C) 2014 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.Preconditions.checkArgument;
import com.google.caliper.BeforeExperiment;
import com.google.caliper.Benchmark;
import com.google.caliper.Param;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
/**
* Provides supporting data for performance notes in the documentation of {@link
* Ordering#sortedCopy} and {@link Ordering#immutableSortedCopy}, as well as for
* automated code suggestions.
*
*/
public class SortedCopyBenchmark {
@Param({"1", "10", "1000", "1000000"}) int size; // logarithmic triangular
@Param boolean mutable;
@Param InputOrder inputOrder;
enum InputOrder {
SORTED {
@Override void arrange(List<Integer> list) {
Collections.sort(list);
}
},
ALMOST_SORTED {
@Override void arrange(List<Integer> list) {
Collections.sort(list);
if (list.size() > 1) {
int i = (list.size() - 1) / 2;
Collections.swap(list, i, i + 1);
}
}
},
RANDOM {
@Override void arrange(List<Integer> list) {}
};
abstract void arrange(List<Integer> list);
}
private ImmutableList<Integer> input;
@BeforeExperiment
void setUp() {
checkArgument(size > 0, "empty collection not supported");
Set<Integer> set = new LinkedHashSet<Integer>(size);
Random random = new Random();
while (set.size() < size) {
set.add(random.nextInt());
}
List<Integer> list = new ArrayList<Integer>(set);
inputOrder.arrange(list);
input = ImmutableList.copyOf(list);
}
@Benchmark
int collections(int reps) {
int dummy = 0;
// Yes, this could be done more elegantly
if (mutable) {
for (int i = 0; i < reps; i++) {
List<Integer> copy = new ArrayList<Integer>(input);
Collections.sort(copy);
dummy += copy.get(0);
}
} else {
for (int i = 0; i < reps; i++) {
List<Integer> copy = new ArrayList<Integer>(input);
Collections.sort(copy);
dummy += ImmutableList.copyOf(copy).get(0);
}
}
return dummy;
}
@Benchmark
int ordering(int reps) {
int dummy = 0;
if (mutable) {
for (int i = 0; i < reps; i++) {
dummy += ORDERING.sortedCopy(input).get(0);
}
} else {
for (int i = 0; i < reps; i++) {
dummy += ORDERING.immutableSortedCopy(input).get(0);
}
}
return dummy;
}
@Benchmark
int sortedSet(int reps) {
int dummy = 0;
if (mutable) {
for (int i = 0; i < reps; i++) {
dummy += new TreeSet<Integer>(input).first();
}
} else {
for (int i = 0; i < reps; i++) {
dummy += ImmutableSortedSet.copyOf(input).first();
}
}
return dummy;
}
private static final Ordering<Integer> ORDERING = Ordering.natural();
}