package biz.paluch.logging.gelf;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import biz.paluch.logging.gelf.intern.GelfMessage;
/**
* @author Mark Paluch
*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class GelfMessageAssemblerPerf {
@State(Scope.Thread)
public static class Input {
public Blackhole bh;
public ByteBuffer heap = ByteBuffer.allocate(1000 * 1000);
public ByteBuffer heap1 = ByteBuffer.allocate(1000 * 1000);
public ByteBuffer direct = ByteBuffer.allocateDirect(1000 * 1000);
public ByteBuffer direct1 = ByteBuffer.allocateDirect(1000 * 1000);
public GelfMessageAssembler assembler = new GelfMessageAssembler();
public LogEvent logEvent = new LogEvent() {
@Override
public String getMessage() {
return "hello";
}
@Override
public Object[] getParameters() {
return new Object[0];
}
@Override
public Throwable getThrowable() {
return null;
}
@Override
public long getLogTimestamp() {
return 0;
}
@Override
public String getSyslogLevel() {
return "5";
}
@Override
public Values getValues(MessageField field) {
return null;
}
@Override
public String getMdcValue(String mdcName) {
return null;
}
@Override
public Set<String> getMdcNames() {
return Collections.emptySet();
}
};
@Setup
public void setup(final Blackhole bh) {
this.bh = bh;
this.assembler.setHost("host");
this.assembler.setOriginHost("host");
}
}
@Benchmark
public void createMessage(Input input) {
input.bh.consume(input.assembler.createGelfMessage(input.logEvent));
}
@Benchmark
public void createMessageToJSON(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.bh.consume(gelfMessage.toJson());
}
@Benchmark
public void createMessageToJSONPooledHeap(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.heap.clear();
gelfMessage.toJson(input.heap, "_");
}
@Benchmark
public void createMessageToJSONPooledDirect(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.direct.clear();
gelfMessage.toJson(input.direct, "_");
}
@Benchmark
public void createMessageToTCPBuffer(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.bh.consume(gelfMessage.toTCPBuffer());
}
@Benchmark
public void createMessageToTCPBufferPooledHeap(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.heap.clear();
gelfMessage.toTCPBuffer(input.heap);
}
@Benchmark
public void createMessageToTCPPooledDirect(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.direct.clear();
gelfMessage.toTCPBuffer(input.direct);
}
@Benchmark
public void createMessageToUDPBuffer(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.bh.consume(gelfMessage.toUDPBuffers());
}
@Benchmark
public void createMessageToUDPBufferPooledHeap(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.heap.clear();
input.heap1.clear();
input.bh.consume(gelfMessage.toUDPBuffers(input.heap, input.heap1));
}
@Benchmark
public void createMessageToUDPBufferPooledDirect(Input input) {
GelfMessage gelfMessage = input.assembler.createGelfMessage(input.logEvent);
input.direct.clear();
input.direct1.clear();
input.bh.consume(gelfMessage.toUDPBuffers(input.direct, input.direct1));
}
public static void main(String[] args) {
GelfMessageAssemblerPerf perf = new GelfMessageAssemblerPerf();
Input input = new Input();
input.setup(null);
perf.createMessage(input);
}
}