You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Gary Gregory <ga...@gmail.com> on 2015/10/05 16:31:11 UTC

Fwd: logging-log4j2 git commit: LOG4J2-1151 Performance improvement: backport fast Java 8 String to byte[] encoder to AbstractStringLayout.

Can we rename the custom encode method to something like encodeSingleBytes? And can't we do this for all encodings with maxBytesPerChar <= 1?
Gsry

-------- Original message --------
From: rpopma@apache.org 
Date: 10/05/2015  06:21  (GMT-08:00) 
To: commits@logging.apache.org 
Subject: logging-log4j2 git commit: LOG4J2-1151 Performance improvement:
  backport fast Java 8 String to byte[] encoder to AbstractStringLayout. 

Repository: logging-log4j2
Updated Branches:
  refs/heads/master f8700e721 -> aabd21883


LOG4J2-1151 Performance improvement: backport fast Java 8 String to
byte[] encoder to AbstractStringLayout.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/aabd2188
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/aabd2188
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/aabd2188

Branch: refs/heads/master
Commit: aabd21883deef5cfef4e589b03a9b2d7588fa9ae
Parents: f8700e7
Author: rpopma <rp...@apache.org>
Authored: Mon Oct 5 15:21:51 2015 +0200
Committer: rpopma <rp...@apache.org>
Committed: Mon Oct 5 15:21:51 2015 +0200

----------------------------------------------------------------------
 .../log4j/core/layout/AbstractStringLayout.java | 23 ++++++++++++++++++++
 src/changes/changes.xml                         |  3 +++
 2 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aabd2188/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index ae6f4c2..0001b20 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -46,6 +46,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     // TODO: Charset is not serializable. Implement read/writeObject() ?
     private final Charset charset;
     private final String charsetName;
+    private final boolean isIso8859_1;
 
     protected AbstractStringLayout(final Charset charset) {
         this(charset, null, null);
@@ -55,6 +56,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
         super(header, footer);
         this.charset = charset == null ? StandardCharsets.UTF_8 : charset;
         this.charsetName = this.charset.name();
+        isIso8859_1 = StandardCharsets.ISO_8859_1.equals(charset);
     }
 
     /**
@@ -66,6 +68,9 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
      */
     static byte[] toBytes(final String str, final Charset charset) {
         if (str != null) {
+            if (StandardCharsets.ISO_8859_1.equals(charset)) {
+                return customEncode(str);
+            }
             final Charset actual = charset != null ? charset : Charset.defaultCharset();
             try { // LOG4J2-935: String.getBytes(String) gives better performance
                 return str.getBytes(actual.name());
@@ -92,6 +97,9 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
     }
 
     protected byte[] getBytes(final String s) {
+        if (isIso8859_1) { // rely on branch prediction to eliminate this check if false
+            return customEncode(s);
+        }
         try { // LOG4J2-935: String.getBytes(String) gives better performance
             return s.getBytes(charsetName);
         } catch (UnsupportedEncodingException e) {
@@ -99,6 +107,21 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> {
         }
     }
 
+    /**
+     * Encode the specified string by casting each character to a byte.
+     * @param s the string to encode
+     * @return the encoded String
+     * @see https://issues.apache.org/jira/browse/LOG4J2-1151
+     */
+    private static byte[] customEncode(String s) {
+        final int length = s.length();
+        final byte[] result = new byte[length];
+        for (int i = 0; i < length; i++) {
+            result[i] = (byte) s.charAt(i);
+        }
+        return result;
+    }
+
     protected Charset getCharset() {
         return charset;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aabd2188/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7195f1f..7ad26f1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -66,6 +66,9 @@
       <action issue="LOG4J2-1126" dev="ggregory" type="fix">
         Web site corrections and updates.
       </action>
+      <action issue="LOG4J2-1151" dev="rpopma" type="update">
+        Performance improvement: backport fast Java 8 String to byte[] encoder to AbstractStringLayout.
+      </action>
       <action issue="LOG4J2-935" dev="rpopma" type="update">
         Performance improvement when converting Strings to byte[] arrays.
       </action>