/*
* 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.facebook.presto.type;
import com.facebook.presto.spi.function.ScalarOperator;
import com.facebook.presto.spi.function.SqlType;
import com.facebook.presto.spi.type.StandardTypes;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.VerboseMode;
import java.util.concurrent.TimeUnit;
import static com.facebook.presto.spi.function.OperatorType.ADD;
import static com.facebook.presto.spi.function.OperatorType.DIVIDE;
import static com.facebook.presto.spi.function.OperatorType.MULTIPLY;
import static com.facebook.presto.spi.function.OperatorType.NEGATION;
import static com.facebook.presto.spi.function.OperatorType.SUBTRACT;
@State(Scope.Thread)
@Fork(2)
@Warmup(iterations = 100, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 100, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.Throughput)
public class BenchmarkBigIntOperators
{
private long leftOperand0;
private long leftOperand1;
private long leftOperand2;
private long leftOperand3;
private long leftOperand4;
private long rightOperand0;
private long rightOperand1;
private long rightOperand2;
private long rightOperand3;
private long rightOperand4;
@Setup
public void setup()
{
leftOperand0 = 1;
leftOperand1 = 20;
leftOperand2 = 33;
leftOperand3 = 407;
leftOperand4 = 7890;
rightOperand0 = 123456;
rightOperand1 = 9003;
rightOperand2 = 809;
rightOperand3 = 67;
rightOperand4 = 5;
}
@Benchmark
public Object overflowChecksAdd()
{
long result = 0;
result += BigintOperators.add(leftOperand0, rightOperand0);
result += BigintOperators.add(leftOperand1, rightOperand0);
result += BigintOperators.add(leftOperand2, rightOperand0);
result += BigintOperators.add(leftOperand3, rightOperand0);
result += BigintOperators.add(leftOperand4, rightOperand0);
result += BigintOperators.add(leftOperand0, rightOperand1);
result += BigintOperators.add(leftOperand1, rightOperand1);
result += BigintOperators.add(leftOperand2, rightOperand1);
result += BigintOperators.add(leftOperand3, rightOperand1);
result += BigintOperators.add(leftOperand4, rightOperand1);
result += BigintOperators.add(leftOperand0, rightOperand2);
result += BigintOperators.add(leftOperand1, rightOperand2);
result += BigintOperators.add(leftOperand2, rightOperand2);
result += BigintOperators.add(leftOperand3, rightOperand2);
result += BigintOperators.add(leftOperand4, rightOperand2);
result += BigintOperators.add(leftOperand0, rightOperand3);
result += BigintOperators.add(leftOperand1, rightOperand3);
result += BigintOperators.add(leftOperand2, rightOperand3);
result += BigintOperators.add(leftOperand3, rightOperand3);
result += BigintOperators.add(leftOperand4, rightOperand3);
result += BigintOperators.add(leftOperand0, rightOperand4);
result += BigintOperators.add(leftOperand1, rightOperand4);
result += BigintOperators.add(leftOperand2, rightOperand4);
result += BigintOperators.add(leftOperand3, rightOperand4);
result += BigintOperators.add(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object overflowChecksSubtract()
{
long result = 0;
result += BigintOperators.subtract(leftOperand0, rightOperand0);
result += BigintOperators.subtract(leftOperand1, rightOperand0);
result += BigintOperators.subtract(leftOperand2, rightOperand0);
result += BigintOperators.subtract(leftOperand3, rightOperand0);
result += BigintOperators.subtract(leftOperand4, rightOperand0);
result += BigintOperators.subtract(leftOperand0, rightOperand1);
result += BigintOperators.subtract(leftOperand1, rightOperand1);
result += BigintOperators.subtract(leftOperand2, rightOperand1);
result += BigintOperators.subtract(leftOperand3, rightOperand1);
result += BigintOperators.subtract(leftOperand4, rightOperand1);
result += BigintOperators.subtract(leftOperand0, rightOperand2);
result += BigintOperators.subtract(leftOperand1, rightOperand2);
result += BigintOperators.subtract(leftOperand2, rightOperand2);
result += BigintOperators.subtract(leftOperand3, rightOperand2);
result += BigintOperators.subtract(leftOperand4, rightOperand2);
result += BigintOperators.subtract(leftOperand0, rightOperand3);
result += BigintOperators.subtract(leftOperand1, rightOperand3);
result += BigintOperators.subtract(leftOperand2, rightOperand3);
result += BigintOperators.subtract(leftOperand3, rightOperand3);
result += BigintOperators.subtract(leftOperand4, rightOperand3);
result += BigintOperators.subtract(leftOperand0, rightOperand4);
result += BigintOperators.subtract(leftOperand1, rightOperand4);
result += BigintOperators.subtract(leftOperand2, rightOperand4);
result += BigintOperators.subtract(leftOperand3, rightOperand4);
result += BigintOperators.subtract(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object overflowChecksMultiply()
{
long result = 0;
result += BigintOperators.multiply(leftOperand0, rightOperand0);
result += BigintOperators.multiply(leftOperand1, rightOperand0);
result += BigintOperators.multiply(leftOperand2, rightOperand0);
result += BigintOperators.multiply(leftOperand3, rightOperand0);
result += BigintOperators.multiply(leftOperand4, rightOperand0);
result += BigintOperators.multiply(leftOperand0, rightOperand1);
result += BigintOperators.multiply(leftOperand1, rightOperand1);
result += BigintOperators.multiply(leftOperand2, rightOperand1);
result += BigintOperators.multiply(leftOperand3, rightOperand1);
result += BigintOperators.multiply(leftOperand4, rightOperand1);
result += BigintOperators.multiply(leftOperand0, rightOperand2);
result += BigintOperators.multiply(leftOperand1, rightOperand2);
result += BigintOperators.multiply(leftOperand2, rightOperand2);
result += BigintOperators.multiply(leftOperand3, rightOperand2);
result += BigintOperators.multiply(leftOperand4, rightOperand2);
result += BigintOperators.multiply(leftOperand0, rightOperand3);
result += BigintOperators.multiply(leftOperand1, rightOperand3);
result += BigintOperators.multiply(leftOperand2, rightOperand3);
result += BigintOperators.multiply(leftOperand3, rightOperand3);
result += BigintOperators.multiply(leftOperand4, rightOperand3);
result += BigintOperators.multiply(leftOperand0, rightOperand4);
result += BigintOperators.multiply(leftOperand1, rightOperand4);
result += BigintOperators.multiply(leftOperand2, rightOperand4);
result += BigintOperators.multiply(leftOperand3, rightOperand4);
result += BigintOperators.multiply(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object overflowChecksDivide()
{
long result = 0;
result += BigintOperators.divide(leftOperand0, rightOperand0);
result += BigintOperators.divide(leftOperand1, rightOperand0);
result += BigintOperators.divide(leftOperand2, rightOperand0);
result += BigintOperators.divide(leftOperand3, rightOperand0);
result += BigintOperators.divide(leftOperand4, rightOperand0);
result += BigintOperators.divide(leftOperand0, rightOperand1);
result += BigintOperators.divide(leftOperand1, rightOperand1);
result += BigintOperators.divide(leftOperand2, rightOperand1);
result += BigintOperators.divide(leftOperand3, rightOperand1);
result += BigintOperators.divide(leftOperand4, rightOperand1);
result += BigintOperators.divide(leftOperand0, rightOperand2);
result += BigintOperators.divide(leftOperand1, rightOperand2);
result += BigintOperators.divide(leftOperand2, rightOperand2);
result += BigintOperators.divide(leftOperand3, rightOperand2);
result += BigintOperators.divide(leftOperand4, rightOperand2);
result += BigintOperators.divide(leftOperand0, rightOperand3);
result += BigintOperators.divide(leftOperand1, rightOperand3);
result += BigintOperators.divide(leftOperand2, rightOperand3);
result += BigintOperators.divide(leftOperand3, rightOperand3);
result += BigintOperators.divide(leftOperand4, rightOperand3);
result += BigintOperators.divide(leftOperand0, rightOperand4);
result += BigintOperators.divide(leftOperand1, rightOperand4);
result += BigintOperators.divide(leftOperand2, rightOperand4);
result += BigintOperators.divide(leftOperand3, rightOperand4);
result += BigintOperators.divide(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object overflowChecksNegate()
{
long result = 0;
result += BigintOperators.negate(leftOperand0);
result += BigintOperators.negate(leftOperand1);
result += BigintOperators.negate(leftOperand2);
result += BigintOperators.negate(leftOperand3);
result += BigintOperators.negate(leftOperand4);
result += BigintOperators.negate(rightOperand0);
result += BigintOperators.negate(rightOperand1);
result += BigintOperators.negate(rightOperand2);
result += BigintOperators.negate(rightOperand3);
result += BigintOperators.negate(rightOperand4);
return result;
}
@Benchmark
public Object baseLineAdd()
{
long result = 0;
result += addBaseline(leftOperand0, rightOperand0);
result += addBaseline(leftOperand1, rightOperand0);
result += addBaseline(leftOperand2, rightOperand0);
result += addBaseline(leftOperand3, rightOperand0);
result += addBaseline(leftOperand4, rightOperand0);
result += addBaseline(leftOperand0, rightOperand1);
result += addBaseline(leftOperand1, rightOperand1);
result += addBaseline(leftOperand2, rightOperand1);
result += addBaseline(leftOperand3, rightOperand1);
result += addBaseline(leftOperand4, rightOperand1);
result += addBaseline(leftOperand0, rightOperand2);
result += addBaseline(leftOperand1, rightOperand2);
result += addBaseline(leftOperand2, rightOperand2);
result += addBaseline(leftOperand3, rightOperand2);
result += addBaseline(leftOperand4, rightOperand2);
result += addBaseline(leftOperand0, rightOperand3);
result += addBaseline(leftOperand1, rightOperand3);
result += addBaseline(leftOperand2, rightOperand3);
result += addBaseline(leftOperand3, rightOperand3);
result += addBaseline(leftOperand4, rightOperand3);
result += addBaseline(leftOperand0, rightOperand4);
result += addBaseline(leftOperand1, rightOperand4);
result += addBaseline(leftOperand2, rightOperand4);
result += addBaseline(leftOperand3, rightOperand4);
result += addBaseline(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object baseLineSubtract()
{
long result = 0;
result += subtractBaseline(leftOperand0, rightOperand0);
result += subtractBaseline(leftOperand1, rightOperand0);
result += subtractBaseline(leftOperand2, rightOperand0);
result += subtractBaseline(leftOperand3, rightOperand0);
result += subtractBaseline(leftOperand4, rightOperand0);
result += subtractBaseline(leftOperand0, rightOperand1);
result += subtractBaseline(leftOperand1, rightOperand1);
result += subtractBaseline(leftOperand2, rightOperand1);
result += subtractBaseline(leftOperand3, rightOperand1);
result += subtractBaseline(leftOperand4, rightOperand1);
result += subtractBaseline(leftOperand0, rightOperand2);
result += subtractBaseline(leftOperand1, rightOperand2);
result += subtractBaseline(leftOperand2, rightOperand2);
result += subtractBaseline(leftOperand3, rightOperand2);
result += subtractBaseline(leftOperand4, rightOperand2);
result += subtractBaseline(leftOperand0, rightOperand3);
result += subtractBaseline(leftOperand1, rightOperand3);
result += subtractBaseline(leftOperand2, rightOperand3);
result += subtractBaseline(leftOperand3, rightOperand3);
result += subtractBaseline(leftOperand4, rightOperand3);
result += subtractBaseline(leftOperand0, rightOperand4);
result += subtractBaseline(leftOperand1, rightOperand4);
result += subtractBaseline(leftOperand2, rightOperand4);
result += subtractBaseline(leftOperand3, rightOperand4);
result += subtractBaseline(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object baseLineMultiply()
{
long result = 0;
result += multiplyBaseline(leftOperand0, rightOperand0);
result += multiplyBaseline(leftOperand1, rightOperand0);
result += multiplyBaseline(leftOperand2, rightOperand0);
result += multiplyBaseline(leftOperand3, rightOperand0);
result += multiplyBaseline(leftOperand4, rightOperand0);
result += multiplyBaseline(leftOperand0, rightOperand1);
result += multiplyBaseline(leftOperand1, rightOperand1);
result += multiplyBaseline(leftOperand2, rightOperand1);
result += multiplyBaseline(leftOperand3, rightOperand1);
result += multiplyBaseline(leftOperand4, rightOperand1);
result += multiplyBaseline(leftOperand0, rightOperand2);
result += multiplyBaseline(leftOperand1, rightOperand2);
result += multiplyBaseline(leftOperand2, rightOperand2);
result += multiplyBaseline(leftOperand3, rightOperand2);
result += multiplyBaseline(leftOperand4, rightOperand2);
result += multiplyBaseline(leftOperand0, rightOperand3);
result += multiplyBaseline(leftOperand1, rightOperand3);
result += multiplyBaseline(leftOperand2, rightOperand3);
result += multiplyBaseline(leftOperand3, rightOperand3);
result += multiplyBaseline(leftOperand4, rightOperand3);
result += multiplyBaseline(leftOperand0, rightOperand4);
result += multiplyBaseline(leftOperand1, rightOperand4);
result += multiplyBaseline(leftOperand2, rightOperand4);
result += multiplyBaseline(leftOperand3, rightOperand4);
result += multiplyBaseline(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object baseLineDivide()
{
long result = 0;
result += divideBaseline(leftOperand0, rightOperand0);
result += divideBaseline(leftOperand1, rightOperand0);
result += divideBaseline(leftOperand2, rightOperand0);
result += divideBaseline(leftOperand3, rightOperand0);
result += divideBaseline(leftOperand4, rightOperand0);
result += divideBaseline(leftOperand0, rightOperand1);
result += divideBaseline(leftOperand1, rightOperand1);
result += divideBaseline(leftOperand2, rightOperand1);
result += divideBaseline(leftOperand3, rightOperand1);
result += divideBaseline(leftOperand4, rightOperand1);
result += divideBaseline(leftOperand0, rightOperand2);
result += divideBaseline(leftOperand1, rightOperand2);
result += divideBaseline(leftOperand2, rightOperand2);
result += divideBaseline(leftOperand3, rightOperand2);
result += divideBaseline(leftOperand4, rightOperand2);
result += divideBaseline(leftOperand0, rightOperand3);
result += divideBaseline(leftOperand1, rightOperand3);
result += divideBaseline(leftOperand2, rightOperand3);
result += divideBaseline(leftOperand3, rightOperand3);
result += divideBaseline(leftOperand4, rightOperand3);
result += divideBaseline(leftOperand0, rightOperand4);
result += divideBaseline(leftOperand1, rightOperand4);
result += divideBaseline(leftOperand2, rightOperand4);
result += divideBaseline(leftOperand3, rightOperand4);
result += divideBaseline(leftOperand4, rightOperand4);
return result;
}
@Benchmark
public Object baseLineNegate()
{
long result = 0;
result += negateBaseLine(leftOperand0);
result += negateBaseLine(leftOperand1);
result += negateBaseLine(leftOperand2);
result += negateBaseLine(leftOperand3);
result += negateBaseLine(leftOperand4);
result += negateBaseLine(rightOperand0);
result += negateBaseLine(rightOperand1);
result += negateBaseLine(rightOperand2);
result += negateBaseLine(rightOperand3);
result += negateBaseLine(rightOperand4);
return result;
}
@ScalarOperator(ADD)
@SqlType(StandardTypes.BIGINT)
private static long addBaseline(@SqlType(StandardTypes.BIGINT) long first, @SqlType(StandardTypes.BIGINT) long second)
{
return first + second;
}
@ScalarOperator(SUBTRACT)
@SqlType(StandardTypes.BIGINT)
private static long subtractBaseline(@SqlType(StandardTypes.BIGINT) long first, @SqlType(StandardTypes.BIGINT) long second)
{
return first - second;
}
@ScalarOperator(MULTIPLY)
@SqlType(StandardTypes.BIGINT)
private static long multiplyBaseline(@SqlType(StandardTypes.BIGINT) long first, @SqlType(StandardTypes.BIGINT) long second)
{
return first * second;
}
@ScalarOperator(DIVIDE)
@SqlType(StandardTypes.BIGINT)
private static long divideBaseline(@SqlType(StandardTypes.BIGINT) long first, @SqlType(StandardTypes.BIGINT) long second)
{
return first / second;
}
@ScalarOperator(NEGATION)
@SqlType(StandardTypes.BIGINT)
private static long negateBaseLine(@SqlType(StandardTypes.BIGINT) long x)
{
return -x;
}
public static void main(String[] args)
throws Throwable
{
Options options = new OptionsBuilder()
.verbosity(VerboseMode.NORMAL)
.include(".*" + BenchmarkBigIntOperators.class.getSimpleName() + ".*")
.build();
new Runner(options).run();
}
}