renamed benchmark
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/29fac8f8 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/29fac8f8 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/29fac8f8 Branch: refs/heads/LOG4J2-1278-gc-free-logger Commit: 29fac8f83a63731f8763e3efb7c19a0518e799c0 Parents: 8cb7c5d Author: rpopma <[email protected]> Authored: Wed Feb 24 00:53:58 2016 +0900 Committer: rpopma <[email protected]> Committed: Wed Feb 24 00:53:58 2016 +0900 ---------------------------------------------------------------------- .../perf/jmh/ParameterizedMessageBenchmark.java | 332 ------------------- .../ParameterizedMessageInliningBenchmark.java | 332 +++++++++++++++++++ 2 files changed, 332 insertions(+), 332 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/29fac8f8/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageBenchmark.java deleted file mode 100644 index 728d2dc..0000000 --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageBenchmark.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * 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.logging.log4j.perf.jmh; - -import java.util.concurrent.TimeUnit; - -import org.apache.logging.log4j.message.ParameterizedMessage; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; - -/** - */ -// ============================== HOW TO RUN THIS TEST: ==================================== -// -// single thread: -// java -jar log4j-perf/target/benchmarks.jar ".*ParameterizedMessage.*" -f 1 -wi 5 -i 10 -// -// multiple threads (for example, 4 threads): -// java -jar log4j-perf/target/benchmarks.jar ".*Nanotime.*" -f 1 -wi 5 -i 10 -t 4 -si true -// -// Usage help: -// java -jar log4j-perf/target/benchmarks.jar -help -// -@State(Scope.Benchmark) -public class ParameterizedMessageBenchmark { - private static final char DELIM_START = '{'; - private static final char DELIM_STOP = '}'; - private static final char ESCAPE_CHAR = '\\'; - private static final String[] ARGS = { "arg1", "arg2" }; - - public static void main(final String[] args) { - } - - @Benchmark - @BenchmarkMode(Mode.SampleTime) - @OutputTimeUnit(TimeUnit.NANOSECONDS) - public String format() { - return format("pattern {} with {} two parameters and some text", ARGS); - } - - @Benchmark - @BenchmarkMode(Mode.SampleTime) - @OutputTimeUnit(TimeUnit.NANOSECONDS) - public String format0() { - return format0("pattern {} with {} two parameters and some text", ARGS); - } - - @Benchmark - @BenchmarkMode(Mode.SampleTime) - @OutputTimeUnit(TimeUnit.NANOSECONDS) - public String formatStringArgs() { - return ParameterizedMessage.format("pattern {} with {} two parameters and some text", ARGS); - } - - @Benchmark - @BenchmarkMode(Mode.SampleTime) - @OutputTimeUnit(TimeUnit.NANOSECONDS) - public String format0_inlined2() { - return format0_inlined2("pattern {} with {} two parameters and some text", ARGS); - } - public static String format(final String messagePattern, final Object[] arguments) { - if (messagePattern == null || arguments == null || arguments.length == 0) { - return messagePattern; - } - - final StringBuilder result = new StringBuilder(); - int escapeCounter = 0; - int currentArgument = 0; - for (int i = 0; i < messagePattern.length(); i++) { - final char curChar = messagePattern.charAt(i); - if (curChar == ESCAPE_CHAR) { - escapeCounter++; - } else { - if (curChar == DELIM_START && i < messagePattern.length() - 1 - && messagePattern.charAt(i + 1) == DELIM_STOP) { - // write escaped escape chars - final int escapedEscapes = escapeCounter / 2; - for (int j = 0; j < escapedEscapes; j++) { - result.append(ESCAPE_CHAR); - } - - if (escapeCounter % 2 == 1) { - // i.e. escaped - // write escaped escape chars - result.append(DELIM_START); - result.append(DELIM_STOP); - } else { - // unescaped - if (currentArgument < arguments.length) { - result.append(arguments[currentArgument]); - } else { - result.append(DELIM_START).append(DELIM_STOP); - } - currentArgument++; - } - i++; - escapeCounter = 0; - continue; - } - // any other char beside ESCAPE or DELIM_START/STOP-combo - // write unescaped escape chars - if (escapeCounter > 0) { - for (int j = 0; j < escapeCounter; j++) { - result.append(ESCAPE_CHAR); - } - escapeCounter = 0; - } - result.append(curChar); - } - } - return result.toString(); - } - - // 259 bytes - public static String format0(final String messagePattern, final String[] arguments) { - if (messagePattern == null || arguments == null || arguments.length == 0) { - return messagePattern; - } - - final int len = messagePattern.length(); - final char[] result = new char[len + sumStringLengths(arguments)]; - int pos = 0; - int escapeCounter = 0; - int currentArgument = 0; - for (int i = 0; i < len; i++) { - final char curChar = messagePattern.charAt(i); - if (curChar == ESCAPE_CHAR) { - escapeCounter++; - } else { - if (curChar == DELIM_START && i < len - 1 && messagePattern.charAt(i + 1) == DELIM_STOP) { - // write escaped escape chars - int escapedEscapes = escapeCounter >> 1; // divide by 2 - while (escapedEscapes > 0) { - result[pos++] = ESCAPE_CHAR; - escapedEscapes--; - } - - if ((escapeCounter & 1) == 1) { - // i.e. escaped - // write escaped escape chars - result[pos++] = DELIM_START; - result[pos++] = DELIM_STOP; - } else { - // unescaped - if (currentArgument < arguments.length) { - final String arg = arguments[currentArgument]; - final int argLen = arg.length(); - arg.getChars(0, argLen, result, pos); - pos += argLen; - } else { - result[pos++] = DELIM_START; - result[pos++] = DELIM_STOP; - } - currentArgument++; - } - i++; - escapeCounter = 0; - continue; - } - // any other char beside ESCAPE or DELIM_START/STOP-combo - // write unescaped escape chars - while (escapeCounter > 0) { - result[pos++] = ESCAPE_CHAR; - escapeCounter--; - } - result[pos++] = curChar; - } - } - return result.toString(); - } - - // 33 bytes - public static String format0_inlined2(final String messagePattern, final String[] arguments) { - int len = 0; - if (messagePattern == null || (len = messagePattern.length()) == 0 || arguments == null - || arguments.length == 0) { - return messagePattern; - } - - return format0_inlined22(messagePattern, len, arguments); - } - - // 157 bytes - private static String format0_inlined22(final String messagePattern, final int len, final String[] arguments) { - final char[] result = new char[len + sumStringLengths(arguments)]; - int pos = 0; - int escapeCounter = 0; - int currentArgument = 0; - int i = 0; - for (; i < len - 1; i++) { - final char curChar = messagePattern.charAt(i); - if (curChar == ESCAPE_CHAR) { - escapeCounter++; - } else { - if (isDelimPair(messagePattern, i, curChar)) { - i++; - - // write escaped escape chars - pos = format0_writeEscapedEscapeChars(escapeCounter, result, pos); - - if (isOdd(escapeCounter)) { - // i.e. escaped - // write escaped escape chars - pos = format0_writeDelimPair(result, pos); - } else { - // unescaped - pos = format0_appendArg(arguments, currentArgument, result, pos); - currentArgument++; - } - } else { - pos = format0_handleLiteralChar(result, pos, escapeCounter, curChar); - } - escapeCounter = 0; - } - } - pos = format0_handleMaybeLastChar(messagePattern, len, result, pos, escapeCounter, i); - return new String(result, 0, pos); - } - - /** - * Returns the sum of the lengths of all Strings in the specified array. - */ - // 27 bytes - private static int sumStringLengths(String[] arguments) { - int result = 0; - for (int i = 0; i < arguments.length; i++) { - result += arguments[i].length(); - } - return result; - } - - // 22 bytes - private static boolean isDelimPair(final String messagePattern, int i, final char curChar) { - return curChar == DELIM_START && messagePattern.charAt(i + 1) == DELIM_STOP; - } - - // 28 bytes - private static int format0_handleMaybeLastChar(final String messagePattern, final int len, final char[] result, - int pos, int escapeCounter, int i) { - if (i == len - 1) { - final char curChar = messagePattern.charAt(i); - pos = format0_handleLastChar(result, pos, escapeCounter, curChar); - } - return pos; - } - - // 28 bytes - private static int format0_handleLastChar(final char[] result, int pos, int escapeCounter, final char curChar) { - if (curChar == ESCAPE_CHAR) { - pos = format0_writeUnescapedEscapeChars(escapeCounter + 1, result, pos); - } else { - pos = format0_handleLiteralChar(result, pos, escapeCounter, curChar); - } - return pos; - } - - // 16 bytes - private static int format0_handleLiteralChar(final char[] result, int pos, int escapeCounter, final char curChar) { - // any other char beside ESCAPE or DELIM_START/STOP-combo - // write unescaped escape chars - pos = format0_writeUnescapedEscapeChars(escapeCounter, result, pos); - result[pos++] = curChar; - return pos; - } - - // 18 bytes - private static int format0_writeDelimPair(final char[] result, int pos) { - result[pos++] = DELIM_START; - result[pos++] = DELIM_STOP; - return pos; - } - - /** - * Returns {@code true} if the specified parameter is odd. - */ - // 11 bytes - private static boolean isOdd(int number) { - return (number & 1) == 1; - } - - // 11 bytes - private static int format0_writeEscapedEscapeChars(int escapeCounter, char[] result, int pos) { - final int escapedEscapes = escapeCounter >> 1; // divide by two - return format0_writeUnescapedEscapeChars(escapedEscapes, result, pos); - } - - // 20 bytes - private static int format0_writeUnescapedEscapeChars(int escapeCounter, char[] result, int pos) { - while (escapeCounter > 0) { - result[pos++] = ESCAPE_CHAR; - escapeCounter--; - } - return pos; - } - - // 25 bytes - private static int format0_appendArg(final String[] arguments, int currentArgument, final char[] result, int pos) { - if (currentArgument < arguments.length) { - pos = format0_appendArg0(arguments, currentArgument, result, pos); - } else { - pos = format0_writeDelimPair(result, pos); - } - return pos; - } - - // 27 bytes - private static int format0_appendArg0(final String[] arguments, int currentArgument, final char[] result, int pos) { - final String arg = arguments[currentArgument]; - final int argLen = arg.length(); - arg.getChars(0, argLen, result, pos); - return pos + argLen; - } -} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/29fac8f8/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageInliningBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageInliningBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageInliningBenchmark.java new file mode 100644 index 0000000..4596d4d --- /dev/null +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ParameterizedMessageInliningBenchmark.java @@ -0,0 +1,332 @@ +/* + * 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.logging.log4j.perf.jmh; + +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.message.ParameterizedMessage; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; + +/** + */ +// ============================== HOW TO RUN THIS TEST: ==================================== +// +// single thread: +// java -jar log4j-perf/target/benchmarks.jar ".*ParameterizedMessage.*" -f 1 -wi 5 -i 10 +// +// multiple threads (for example, 4 threads): +// java -jar log4j-perf/target/benchmarks.jar ".*ParameterizedMessage.*" -f 1 -wi 5 -i 10 -t 4 -si true +// +// Usage help: +// java -jar log4j-perf/target/benchmarks.jar -help +// +@State(Scope.Benchmark) +public class ParameterizedMessageInliningBenchmark { + private static final char DELIM_START = '{'; + private static final char DELIM_STOP = '}'; + private static final char ESCAPE_CHAR = '\\'; + private static final String[] ARGS = { "arg1", "arg2" }; + + public static void main(final String[] args) { + } + + @Benchmark + @BenchmarkMode(Mode.SampleTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public String format() { + return format("pattern {} with {} two parameters and some text", ARGS); + } + + @Benchmark + @BenchmarkMode(Mode.SampleTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public String format0() { + return format0("pattern {} with {} two parameters and some text", ARGS); + } + + @Benchmark + @BenchmarkMode(Mode.SampleTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public String formatStringArgs() { + return ParameterizedMessage.format("pattern {} with {} two parameters and some text", ARGS); + } + + @Benchmark + @BenchmarkMode(Mode.SampleTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + public String format0_inlined2() { + return format0_inlined2("pattern {} with {} two parameters and some text", ARGS); + } + public static String format(final String messagePattern, final Object[] arguments) { + if (messagePattern == null || arguments == null || arguments.length == 0) { + return messagePattern; + } + + final StringBuilder result = new StringBuilder(); + int escapeCounter = 0; + int currentArgument = 0; + for (int i = 0; i < messagePattern.length(); i++) { + final char curChar = messagePattern.charAt(i); + if (curChar == ESCAPE_CHAR) { + escapeCounter++; + } else { + if (curChar == DELIM_START && i < messagePattern.length() - 1 + && messagePattern.charAt(i + 1) == DELIM_STOP) { + // write escaped escape chars + final int escapedEscapes = escapeCounter / 2; + for (int j = 0; j < escapedEscapes; j++) { + result.append(ESCAPE_CHAR); + } + + if (escapeCounter % 2 == 1) { + // i.e. escaped + // write escaped escape chars + result.append(DELIM_START); + result.append(DELIM_STOP); + } else { + // unescaped + if (currentArgument < arguments.length) { + result.append(arguments[currentArgument]); + } else { + result.append(DELIM_START).append(DELIM_STOP); + } + currentArgument++; + } + i++; + escapeCounter = 0; + continue; + } + // any other char beside ESCAPE or DELIM_START/STOP-combo + // write unescaped escape chars + if (escapeCounter > 0) { + for (int j = 0; j < escapeCounter; j++) { + result.append(ESCAPE_CHAR); + } + escapeCounter = 0; + } + result.append(curChar); + } + } + return result.toString(); + } + + // 259 bytes + public static String format0(final String messagePattern, final String[] arguments) { + if (messagePattern == null || arguments == null || arguments.length == 0) { + return messagePattern; + } + + final int len = messagePattern.length(); + final char[] result = new char[len + sumStringLengths(arguments)]; + int pos = 0; + int escapeCounter = 0; + int currentArgument = 0; + for (int i = 0; i < len; i++) { + final char curChar = messagePattern.charAt(i); + if (curChar == ESCAPE_CHAR) { + escapeCounter++; + } else { + if (curChar == DELIM_START && i < len - 1 && messagePattern.charAt(i + 1) == DELIM_STOP) { + // write escaped escape chars + int escapedEscapes = escapeCounter >> 1; // divide by 2 + while (escapedEscapes > 0) { + result[pos++] = ESCAPE_CHAR; + escapedEscapes--; + } + + if ((escapeCounter & 1) == 1) { + // i.e. escaped + // write escaped escape chars + result[pos++] = DELIM_START; + result[pos++] = DELIM_STOP; + } else { + // unescaped + if (currentArgument < arguments.length) { + final String arg = arguments[currentArgument]; + final int argLen = arg.length(); + arg.getChars(0, argLen, result, pos); + pos += argLen; + } else { + result[pos++] = DELIM_START; + result[pos++] = DELIM_STOP; + } + currentArgument++; + } + i++; + escapeCounter = 0; + continue; + } + // any other char beside ESCAPE or DELIM_START/STOP-combo + // write unescaped escape chars + while (escapeCounter > 0) { + result[pos++] = ESCAPE_CHAR; + escapeCounter--; + } + result[pos++] = curChar; + } + } + return result.toString(); + } + + // 33 bytes + public static String format0_inlined2(final String messagePattern, final String[] arguments) { + int len = 0; + if (messagePattern == null || (len = messagePattern.length()) == 0 || arguments == null + || arguments.length == 0) { + return messagePattern; + } + + return format0_inlined22(messagePattern, len, arguments); + } + + // 157 bytes + private static String format0_inlined22(final String messagePattern, final int len, final String[] arguments) { + final char[] result = new char[len + sumStringLengths(arguments)]; + int pos = 0; + int escapeCounter = 0; + int currentArgument = 0; + int i = 0; + for (; i < len - 1; i++) { + final char curChar = messagePattern.charAt(i); + if (curChar == ESCAPE_CHAR) { + escapeCounter++; + } else { + if (isDelimPair(messagePattern, i, curChar)) { + i++; + + // write escaped escape chars + pos = format0_writeEscapedEscapeChars(escapeCounter, result, pos); + + if (isOdd(escapeCounter)) { + // i.e. escaped + // write escaped escape chars + pos = format0_writeDelimPair(result, pos); + } else { + // unescaped + pos = format0_appendArg(arguments, currentArgument, result, pos); + currentArgument++; + } + } else { + pos = format0_handleLiteralChar(result, pos, escapeCounter, curChar); + } + escapeCounter = 0; + } + } + pos = format0_handleMaybeLastChar(messagePattern, len, result, pos, escapeCounter, i); + return new String(result, 0, pos); + } + + /** + * Returns the sum of the lengths of all Strings in the specified array. + */ + // 27 bytes + private static int sumStringLengths(String[] arguments) { + int result = 0; + for (int i = 0; i < arguments.length; i++) { + result += arguments[i].length(); + } + return result; + } + + // 22 bytes + private static boolean isDelimPair(final String messagePattern, int i, final char curChar) { + return curChar == DELIM_START && messagePattern.charAt(i + 1) == DELIM_STOP; + } + + // 28 bytes + private static int format0_handleMaybeLastChar(final String messagePattern, final int len, final char[] result, + int pos, int escapeCounter, int i) { + if (i == len - 1) { + final char curChar = messagePattern.charAt(i); + pos = format0_handleLastChar(result, pos, escapeCounter, curChar); + } + return pos; + } + + // 28 bytes + private static int format0_handleLastChar(final char[] result, int pos, int escapeCounter, final char curChar) { + if (curChar == ESCAPE_CHAR) { + pos = format0_writeUnescapedEscapeChars(escapeCounter + 1, result, pos); + } else { + pos = format0_handleLiteralChar(result, pos, escapeCounter, curChar); + } + return pos; + } + + // 16 bytes + private static int format0_handleLiteralChar(final char[] result, int pos, int escapeCounter, final char curChar) { + // any other char beside ESCAPE or DELIM_START/STOP-combo + // write unescaped escape chars + pos = format0_writeUnescapedEscapeChars(escapeCounter, result, pos); + result[pos++] = curChar; + return pos; + } + + // 18 bytes + private static int format0_writeDelimPair(final char[] result, int pos) { + result[pos++] = DELIM_START; + result[pos++] = DELIM_STOP; + return pos; + } + + /** + * Returns {@code true} if the specified parameter is odd. + */ + // 11 bytes + private static boolean isOdd(int number) { + return (number & 1) == 1; + } + + // 11 bytes + private static int format0_writeEscapedEscapeChars(int escapeCounter, char[] result, int pos) { + final int escapedEscapes = escapeCounter >> 1; // divide by two + return format0_writeUnescapedEscapeChars(escapedEscapes, result, pos); + } + + // 20 bytes + private static int format0_writeUnescapedEscapeChars(int escapeCounter, char[] result, int pos) { + while (escapeCounter > 0) { + result[pos++] = ESCAPE_CHAR; + escapeCounter--; + } + return pos; + } + + // 25 bytes + private static int format0_appendArg(final String[] arguments, int currentArgument, final char[] result, int pos) { + if (currentArgument < arguments.length) { + pos = format0_appendArg0(arguments, currentArgument, result, pos); + } else { + pos = format0_writeDelimPair(result, pos); + } + return pos; + } + + // 27 bytes + private static int format0_appendArg0(final String[] arguments, int currentArgument, final char[] result, int pos) { + final String arg = arguments[currentArgument]; + final int argLen = arg.length(); + arg.getChars(0, argLen, result, pos); + return pos + argLen; + } +}
