/**
* 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 org.apache.hive.benchmark.vectorization;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression;
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.OutputTimeUnit;
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 java.util.Random;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@Fork(1)
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public abstract class AbstractExpression {
private static final int DEFAULT_ITER_TIME = 1000000;
protected VectorExpression expression;
protected VectorizedRowBatch rowBatch;
protected VectorizedRowBatch buildRowBatch(ColumnVector output, int colNum, ColumnVector...
cols) {
VectorizedRowBatch rowBatch = new VectorizedRowBatch(colNum + 1);
for (int i = 0; i < cols.length; i++) {
rowBatch.cols[i] = cols[i];
}
rowBatch.cols[colNum] = output;
return rowBatch;
}
@Setup
public abstract void setup();
@Benchmark
@Warmup(iterations = 2, time = 2, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 2, time = 2, timeUnit = TimeUnit.MILLISECONDS)
public void bench() {
for (int i = 0; i < DEFAULT_ITER_TIME; i++) {
rowBatch.selectedInUse = false;
rowBatch.size = VectorizedRowBatch.DEFAULT_SIZE;
expression.evaluate(rowBatch);
}
}
protected LongColumnVector getLongColumnVector() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
columnVector.vector[i] = random.nextLong();
}
return columnVector;
}
protected LongColumnVector getRepeatingLongColumnVector() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.fill(2);
return columnVector;
}
protected LongColumnVector getLongColumnVectorWithNull() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.noNulls = false;
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
if (i % 100 == 0) {
columnVector.isNull[i] = true;
}
columnVector.vector[i] = random.nextLong();
}
return columnVector;
}
protected LongColumnVector getBooleanLongColumnVector() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
columnVector.vector[i] = random.nextInt(2);
}
return columnVector;
}
protected LongColumnVector getBooleanRepeatingLongColumnVector() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.fill(1);
return columnVector;
}
protected LongColumnVector getBooleanLongColumnVectorWithNull() {
LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.noNulls = false;
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
if (i % 100 == 0) {
columnVector.isNull[i] = true;
}
columnVector.vector[i] = random.nextInt(2);
}
return columnVector;
}
protected DoubleColumnVector getDoubleColumnVector() {
DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
columnVector.vector[i] = random.nextDouble();
}
return columnVector;
}
protected DoubleColumnVector getRepeatingDoubleColumnVector() {
DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.fill(2.0d);
return columnVector;
}
protected DoubleColumnVector getDoubleColumnVectorWithNull() {
DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
columnVector.noNulls = false;
Random random = new Random();
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
if (i % 100 == 0) {
columnVector.isNull[i] = true;
}
columnVector.vector[i] = random.nextDouble();
}
return columnVector;
}
protected BytesColumnVector getBytesColumnVector() {
BytesColumnVector columnVector = new BytesColumnVector(VectorizedRowBatch.DEFAULT_SIZE);
Random random = new Random();
int length = 16;
for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) {
columnVector.vector[i] = new byte[length];
columnVector.start[i] = 0;
columnVector.length[i] = length;
for (int j = 0; j < length; j++) {
columnVector.vector[i][j] = (byte)(random.nextInt(+ 'c' - 'a' + 1) + 'a');
}
}
return columnVector;
}
}