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: [email protected] Date: 10/05/2015 06:21 (GMT-08:00) To: [email protected] 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 <[email protected]> Authored: Mon Oct 5 15:21:51 2015 +0200 Committer: rpopma <[email protected]> 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>
