WriterBenchmark.java
/*******************************************************************************
* Copyright (c) 2021 Eclipse RDF4J contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/
package org.eclipse.rdf4j.benchmark.rio;
import java.io.OutputStream;
import java.util.concurrent.TimeUnit;
import org.eclipse.rdf4j.benchmark.rio.util.DataSetGenerator;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.rio.helpers.ContextStatementCollector;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
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.util.NullOutputStream;
/**
* Benchmark for {@link org.eclipse.rdf4j.rio.RDFWriter}s using datasets generated by {@link DataSetGenerator}.
*
* @author Frens Jan Rumph
*/
@State(Scope.Benchmark)
@Warmup(iterations = 3)
@Measurement(iterations = 3)
@OutputTimeUnit(TimeUnit.SECONDS)
@BenchmarkMode({ Mode.AverageTime })
@Fork(value = 1, jvmArgs = { "-Xms4g", "-Xmx4g", "-XX:+UseSerialGC" })
public class WriterBenchmark {
public static final int TOTAL_STATEMENTS = 100_000;
public static final int MIN_STRING_LENGTH = 10;
public static final int MAX_STRING_LENGTH = 300;
public static final int PERCENT_BNODE = 30;
public static final int PERCENT_LITERALS = 50;
public static final boolean TEXT_ONLY = false;
@Param({
"brf",
"jsonld",
"n3",
"nq",
"nt",
"rdf",
"rj",
"trig",
"trix",
"ttl",
})
public String format;
private RDFFormat writerFormat;
private Model model;
@Setup(Level.Trial)
public void setup() {
writerFormat = Rio.getWriterFormatForFileName("dummy." + format).orElseThrow();
model = new LinkedHashModel();
SimpleValueFactory valueFactory = SimpleValueFactory.getInstance();
ContextStatementCollector handler = new ContextStatementCollector(model, valueFactory);
DataSetGenerator generator = new DataSetGenerator();
generator.generateStatements(handler, PERCENT_BNODE, PERCENT_LITERALS,
MIN_STRING_LENGTH, MAX_STRING_LENGTH, TOTAL_STATEMENTS, TEXT_ONLY, true);
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
public void writer() {
OutputStream out = new NullOutputStream();
Rio.write(model, out, writerFormat);
}
}