blob: 536bfbf5113a8a55703fa8526910d0ec979a4d09 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.uima.cas.serdes;
import static java.lang.System.currentTimeMillis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import javax.annotation.Generated;
import org.apache.commons.lang3.function.FailableBiConsumer;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.serdes.generators.CasGenerator;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.metadata.TypeSystemDescription;
import org.apache.uima.util.CasCreationUtils;
public class PerformanceTestRunner {
private final FailableBiConsumer<InputStream, CAS, Exception> deserializer;
private final FailableBiConsumer<CAS, OutputStream, Exception> serializer;
private final int iterations;
private final int warmUpIterations;
private CasGenerator generator;
private CAS randomizedCas;
private CAS targetCas;
private byte[] randomizedCasBytes;
private PerformanceTestRunner(Builder builder) {
this.iterations = builder.iterations;
this.warmUpIterations = builder.warmUpIterations;
this.generator = builder.generator;
this.serializer = builder.serializer;
this.deserializer = builder.deserializer;
try {
TypeSystemDescription tsd = generator.generateTypeSystem();
randomizedCas = generator.generateCas(tsd);
targetCas = CasCreationUtils.createCas(tsd, null, null, null);
} catch (ResourceInitializationException e) {
throw new IllegalStateException(e);
}
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
serializer.accept(randomizedCas, bos);
randomizedCasBytes = bos.toByteArray();
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
public void writeData(Path aPath) throws IOException {
Files.createDirectories(aPath.getParent());
try (OutputStream os = Files.newOutputStream(aPath)) {
os.write(randomizedCasBytes);
}
}
public int getDataSize() {
return randomizedCasBytes.length;
}
public long measureSerializationPerformance() throws Exception {
long total = 0;
for (int i = 0; i < iterations + warmUpIterations; i++) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
long start = currentTimeMillis();
serializer.accept(randomizedCas, bos);
if (i >= warmUpIterations) {
total += currentTimeMillis() - start;
}
}
}
return total;
}
public long measureDeserializationPerformance() throws Exception {
long total = 0;
for (int i = 0; i < iterations + warmUpIterations; i++) {
try (ByteArrayInputStream bis = new ByteArrayInputStream(randomizedCasBytes)) {
long start = currentTimeMillis();
deserializer.accept(bis, targetCas);
if (i >= warmUpIterations) {
total += currentTimeMillis() - start;
}
}
targetCas.reset();
}
return total;
}
/**
* Creates builder to build {@link PerformanceTestRunner}.
*
* @return created builder
*/
@Generated("SparkTools")
public static Builder builder() {
return new Builder();
}
/**
* Builder to build {@link PerformanceTestRunner}.
*/
public static final class Builder {
private int iterations = 100;
private int warmUpIterations = 5;
private CasGenerator generator;
private FailableBiConsumer<InputStream, CAS, Exception> deserializer;
private FailableBiConsumer<CAS, OutputStream, Exception> serializer;
private Builder() {
}
public Builder withSerializer(FailableBiConsumer<CAS, OutputStream, Exception> aSerializer) {
this.serializer = aSerializer;
return this;
}
public Builder withDeserializer(FailableBiConsumer<InputStream, CAS, Exception> aDeserializer) {
this.deserializer = aDeserializer;
return this;
}
public Builder withIterations(int iterations) {
this.iterations = iterations;
return this;
}
public Builder withWarmUpIterations(int iterations) {
this.warmUpIterations = iterations;
return this;
}
public Builder withGenerator(CasGenerator generator) {
this.generator = generator;
return this;
}
public PerformanceTestRunner build() {
return new PerformanceTestRunner(this);
}
}
}