You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/03/28 10:11:43 UTC
[4/4] logging-log4j2 git commit: LOG4J2-1271 use the
System.arrayCopy-based fast copy where possible for formatting the message
LOG4J2-1271 use the System.arrayCopy-based fast copy where possible for formatting the message
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a2182856
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a2182856
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a2182856
Branch: refs/heads/master
Commit: a21828565ba164aea8fe6356d656d0a345d99f4e
Parents: 8242eb6
Author: rpopma <rp...@apache.org>
Authored: Mon Mar 28 17:11:43 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Mar 28 17:11:43 2016 +0900
----------------------------------------------------------------------
.../log4j/message/ParameterizedMessage.java | 13 ++++++++++---
.../message/ReusableParameterizedMessage.java | 20 +++++++++++++++++---
2 files changed, 27 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a2182856/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
index fe22b02..e1ef2a5 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
@@ -67,6 +67,7 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable {
private String formattedMessage;
private transient Throwable throwable;
+ private int[] indices;
/**
* Creates a parameterized message.
@@ -133,7 +134,8 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable {
private void init(String messagePattern) {
this.messagePattern = messagePattern;
- final int usedCount = countArgumentPlaceholders(messagePattern);
+ this.indices = new int[messagePattern == null ? 0 : messagePattern.length() << 1];
+ final int usedCount = ParameterFormatter.countArgumentPlaceholders2(messagePattern, indices);
initThrowable(argArray, usedCount);
}
@@ -207,8 +209,13 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable {
if (formattedMessage != null) {
buffer.append(formattedMessage);
} else {
- ParameterFormatter.formatMessage(buffer, messagePattern, argArray,
- argArray == null ? 0 : argArray.length);
+ if (indices[0] < 0) {
+ ParameterFormatter.formatMessage(buffer, messagePattern, argArray,
+ argArray == null ? 0 : argArray.length);
+ } else {
+ ParameterFormatter.formatMessage2(buffer, messagePattern, argArray,
+ argArray == null ? 0 : argArray.length, indices);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a2182856/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
index bd6205f..bf7095c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
@@ -35,6 +35,7 @@ public class ReusableParameterizedMessage implements ReusableMessage {
private String messagePattern;
private int argCount;
+ private int[] indices = new int[256];
private transient Object[] varargs;
private transient Object[] params = new Object[10];
private transient Throwable throwable;
@@ -53,14 +54,23 @@ public class ReusableParameterizedMessage implements ReusableMessage {
return varargs == null ? params : varargs;
}
- private void init(String messagePattern, int argCount, Object[] paramArray) {
+ private void init(final String messagePattern, final int argCount, final Object[] paramArray) {
this.varargs = null;
this.messagePattern = messagePattern;
this.argCount= argCount;
- int usedCount = ParameterFormatter.countArgumentPlaceholders(messagePattern);
+ int usedCount = count(messagePattern, indices);
initThrowable(paramArray, usedCount);
}
+ private static int count(final String messagePattern, final int[] indices) {
+ try {
+ // try the fast path first
+ return ParameterFormatter.countArgumentPlaceholders2(messagePattern, indices);
+ } catch (final Exception ex) { // fallback if more than int[] length (256) parameter placeholders
+ return ParameterFormatter.countArgumentPlaceholders(messagePattern);
+ }
+ }
+
private void initThrowable(final Object[] params, final int usedParams) {
if (usedParams < argCount && this.throwable == null && params[argCount - 1] instanceof Throwable) {
this.throwable = (Throwable) params[argCount - 1];
@@ -238,7 +248,11 @@ public class ReusableParameterizedMessage implements ReusableMessage {
@Override
public void formatTo(final StringBuilder buffer) {
- ParameterFormatter.formatMessage(buffer, messagePattern, getParams(), argCount);
+ if (indices[0] < 0) {
+ ParameterFormatter.formatMessage(buffer, messagePattern, getParams(), argCount);
+ } else {
+ ParameterFormatter.formatMessage2(buffer, messagePattern, getParams(), argCount, indices);
+ }
}