blob: eceb72dd42a55bc412765da41b50d729312ecb0e [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc.
*
* 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 examples;
import com.google.caliper.BeforeExperiment;
import com.google.caliper.Benchmark;
import com.google.caliper.Param;
import com.google.caliper.api.SkipThisScenarioException;
import java.util.Random;
/**
* Benchmarks the overhead created by using varargs instead of parameter expansion.
*
* @author gak@google.com (Gregory Kick)
*/
public final class VarargsBenchmark {
enum Strategy {
VARARGS {
@Override long one(long a) {
return varargs(a);
}
@Override long two(long a, long b) {
return varargs(a, b);
}
@Override long three(long a, long b, long c) {
return varargs(a, b, c);
}
@Override long four(long a, long b, long c, long d) {
return varargs(a, b, c, d);
}
@Override long five(long a, long b, long c, long d, long e) {
return varargs(a, b, c, d);
}
@Override long six(long a, long b, long c, long d, long e, long f) {
return varargs(a, b, c, d, e, f);
}},
EXPANSION {
@Override long one(long a) {
return VarargsBenchmark.one(a);
}
@Override long two(long a, long b) {
return VarargsBenchmark.two(a, b);
}
@Override long three(long a, long b, long c) {
return VarargsBenchmark.three(a, b, c);
}
@Override long four(long a, long b, long c, long d) {
return VarargsBenchmark.four(a, b, c, d);
}
@Override long five(long a, long b, long c, long d, long e) {
return VarargsBenchmark.five(a, b, c, d, e);
}
@Override long six(long a, long b, long c, long d, long e, long f) {
return VarargsBenchmark.six(a, b, c, d, e, f);
}
};
abstract long one(long a);
abstract long two(long a, long b);
abstract long three(long a, long b, long c);
abstract long four(long a, long b, long c, long d);
abstract long five(long a, long b, long c, long d, long e);
abstract long six(long a, long b, long c, long d, long e, long f);
}
private static long varargs(long... longs) {
long result = 0;
for (long i : longs) {
result ^= i;
}
return result;
}
private static long one(long a) {
return a;
}
private static long two(long a, long b) {
return a ^ b;
}
private static long three(long a, long b, long c) {
return a ^ b ^ c;
}
private static long four(long a, long b, long c, long d) {
return a ^ b ^ c ^ d;
}
private static long five(long a, long b, long c, long d, long e) {
return a ^ b ^ c ^ d ^ e;
}
private static long six(long a, long b, long c, long d, long e, long f) {
return a ^ b ^ c ^ d ^ e ^ f;
}
@Param private Strategy strategy;
@Param({"1", "2", "3", "4", "5", "6"}) private int arguments;
private long[] data = new long[2048];
@BeforeExperiment void setUp() {
Random random = new Random();
for (int i = 0; i < data.length; i++) {
data[i] = random.nextLong();
}
}
@Benchmark long invocation(int reps) {
switch (arguments) {
case 1:
return oneArgument(reps);
case 2:
return twoArguments(reps);
case 3:
return threeArguments(reps);
case 4:
return fourArguments(reps);
case 5:
return fiveArguments(reps);
case 6:
return sixArguments(reps);
default:
throw new SkipThisScenarioException();
}
}
private long oneArgument(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.one(data[i % dataLength]);
}
return dummy;
}
private long twoArguments(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.two(data[i % dataLength], data[(i + 1) % dataLength]);
}
return dummy;
}
private long threeArguments(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.three(
data[i % dataLength],
data[(i + 1) % dataLength],
data[(i + 2) % dataLength]);
}
return dummy;
}
private long fourArguments(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.four(
data[i % dataLength],
data[(i + 1) % dataLength],
data[(i + 2) % dataLength],
data[(i + 3) % dataLength]);
}
return dummy;
}
private long fiveArguments(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.five(
data[i % dataLength],
data[(i + 1) % dataLength],
data[(i + 2) % dataLength],
data[(i + 3) % dataLength],
data[(i + 4) % dataLength]);
}
return dummy;
}
private long sixArguments(int reps) {
long dummy = 0;
long[] data = this.data;
int dataLength = data.length;
for (int i = 0; i < reps; i++) {
dummy += strategy.six(
data[i % dataLength],
data[(i + 1) % dataLength],
data[(i + 2) % dataLength],
data[(i + 3) % dataLength],
data[(i + 4) % dataLength],
data[(i + 5) % dataLength]);
}
return dummy;
}
}