Package examples

Source Code of examples.VarargsBenchmark

/*
* 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;
  }
}
TOP

Related Classes of examples.VarargsBenchmark

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.