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);
+        }
     }