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>