Test encoding
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f99ef525 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f99ef525 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f99ef525 Branch: refs/heads/gelf-layout-efficiency Commit: f99ef52500ee79d81670494b05c0ad8be5eda475 Parents: 8167fff Author: Mikael Ståldal <[email protected]> Authored: Wed May 18 16:43:16 2016 +0200 Committer: Mikael Ståldal <[email protected]> Committed: Wed May 18 16:43:16 2016 +0200 ---------------------------------------------------------------------- ...ractStringLayoutStringEncodingBenchmark.java | 97 +++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f99ef525/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AbstractStringLayoutStringEncodingBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AbstractStringLayoutStringEncodingBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AbstractStringLayoutStringEncodingBenchmark.java index 96ffebb..8a49861 100644 --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AbstractStringLayoutStringEncodingBenchmark.java +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AbstractStringLayoutStringEncodingBenchmark.java @@ -17,6 +17,7 @@ package org.apache.logging.log4j.perf.jmh; +import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -27,8 +28,11 @@ import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.impl.Log4jLogEvent; import org.apache.logging.log4j.core.layout.AbstractStringLayout; +import org.apache.logging.log4j.core.layout.ByteBufferDestination; +import org.apache.logging.log4j.core.layout.Encoder; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.SimpleMessage; +import org.apache.logging.log4j.util.StringBuilderFormattable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Mode; @@ -59,8 +63,15 @@ public class AbstractStringLayoutStringEncodingBenchmark { private Layout utf8CseqLayout; private Layout utf16CseqLayout; + private Layout usAsciiEncodingLayout; + private Layout iso8859_1EncodingLayout; + private Layout utf8EncodingLayout; + private Layout utf16EncodingLayout; + private LogEvent logEvent; + private Destination destination; + @Setup public void setUp() { bytes = new byte[128]; @@ -78,10 +89,17 @@ public class AbstractStringLayoutStringEncodingBenchmark { utf8CseqLayout = new CseqLayout(Charset.forName("UTF-8")); utf16CseqLayout = new CseqLayout(Charset.forName("UTF-16")); + usAsciiEncodingLayout = new EncodingLayout(Charset.forName("US-ASCII")); + iso8859_1EncodingLayout = new EncodingLayout(Charset.forName("ISO-8859-1")); + utf8EncodingLayout = new EncodingLayout(Charset.forName("UTF-8")); + utf16EncodingLayout = new EncodingLayout(Charset.forName("UTF-16")); + StringBuilder msg = new StringBuilder(); msg.append(MESSAGE); logEvent = createLogEvent(new SimpleMessage(msg)); + + destination = new Destination(); } private static LogEvent createLogEvent(Message message) { @@ -134,6 +152,13 @@ public class AbstractStringLayoutStringEncodingBenchmark { @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Benchmark + public void usAsciiEncoding() { + usAsciiEncodingLayout.encode(logEvent, destination); + } + + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Benchmark public void iso8859_1String() { consume(iso8859_1StringLayout.toByteArray(logEvent)); } @@ -148,6 +173,13 @@ public class AbstractStringLayoutStringEncodingBenchmark { @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Benchmark + public void iso8859_1Encoding() { + iso8859_1EncodingLayout.encode(logEvent, destination); + } + + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Benchmark public void utf8String() { consume(utf8StringLayout.toByteArray(logEvent)); } @@ -162,6 +194,13 @@ public class AbstractStringLayoutStringEncodingBenchmark { @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Benchmark + public void utf8Encoding() { + utf8EncodingLayout.encode(logEvent, destination); + } + + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Benchmark public void utf16String() { consume(utf16StringLayout.toByteArray(logEvent)); } @@ -173,12 +212,27 @@ public class AbstractStringLayoutStringEncodingBenchmark { consume(utf16CseqLayout.toByteArray(logEvent)); } - private long consume(byte[] bytes) { + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Benchmark + public void utf16Encoding() { + utf16EncodingLayout.encode(logEvent, destination); + } + + private static long consume(byte[] bytes) { long checksum = 0; for (byte b : bytes) checksum += b; return checksum; } + private static long consume(byte[] bytes, int offset, int length) { + long checksum = 0; + for (int i = offset; i < length; i++) { + checksum += bytes[i]; + } + return checksum; + } + private static class StringLayout extends AbstractStringLayout { public StringLayout(Charset charset) { super(charset); @@ -223,4 +277,45 @@ public class AbstractStringLayoutStringEncodingBenchmark { } } + private static class EncodingLayout extends AbstractStringLayout { + public EncodingLayout(Charset charset) { + super(charset); + } + + @Override + public String toSerializable(LogEvent event) { + return null; + } + + @Override + public byte[] toByteArray(LogEvent event) { + return null; + } + + @Override + public void encode(final LogEvent event, final ByteBufferDestination destination) { + StringBuilder sb = getStringBuilder(); + ((StringBuilderFormattable) event.getMessage()).formatTo(sb); + final Encoder<StringBuilder> helper = getStringBuilderEncoder(); + helper.encode(sb, destination); + } + } + + private static class Destination implements ByteBufferDestination { + ByteBuffer buffer = ByteBuffer.wrap(new byte[512]); + + @Override + public ByteBuffer getByteBuffer() { + return buffer; + } + + @Override + public ByteBuffer drain(ByteBuffer buf) { + buf.flip(); + consume(buf.array(), buf.position(), buf.limit()); + buf.clear(); + return buf; + } + } + }
