However, I used a tool so it might be a pretty close match to the original
source code, not sure. Also, the method names are unchanged.

On Tue, Oct 6, 2015 at 1:44 AM, Remko Popma <[email protected]> wrote:

> This is not a copy of Oracle's source code but my interpretation of the
> relevant byte codes.
>
> On Tue, Oct 6, 2015 at 1:31 AM, Gary Gregory <[email protected]>
> wrote:
>
>> I am worried and almost -1 here: It is OK to copy from OpenJDK but I bet
>> it's not OK to copy from Oracle's JRE... but how can we properly benchmark
>> then?
>>
>> Gary
>>
>> ---------- Forwarded message ----------
>> From: <[email protected]>
>> Date: Mon, Oct 5, 2015 at 4:14 PM
>> Subject: [1/2] logging-log4j2 git commit: LOG4J2-1151 updated: added
>> exact port of JDK 8 logic for handling invalid input, renamed methods
>> To: [email protected]
>>
>>
>> Repository: logging-log4j2
>> Updated Branches:
>>   refs/heads/master 2612b61e6 -> 8b9d10095
>>
>>
>> LOG4J2-1151 updated: added exact port of JDK 8 logic for handling
>> invalid input, renamed methods
>>
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>> Commit:
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1360daa6
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1360daa6
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1360daa6
>>
>> Branch: refs/heads/master
>> Commit: 1360daa694ed247b100d8d19336c92ecebd147ff
>> Parents: 9bc8144
>> Author: rpopma <[email protected]>
>> Authored: Tue Oct 6 01:14:18 2015 +0200
>> Committer: rpopma <[email protected]>
>> Committed: Tue Oct 6 01:14:18 2015 +0200
>>
>> ----------------------------------------------------------------------
>>  .../log4j/perf/jmh/StringEncodingBenchmark.java | 151 +++++++++++++++++--
>>  1 file changed, 137 insertions(+), 14 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1360daa6/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringEncodingBenchmark.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringEncodingBenchmark.java
>> b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringEncodingBenchmark.java
>> index 4159b2a..7e9459c 100644
>> ---
>> a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringEncodingBenchmark.java
>> +++
>> b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringEncodingBenchmark.java
>> @@ -35,7 +35,7 @@ import org.openjdk.jmh.annotations.State;
>>   * Tests Log4j2 StringEncoding performance.
>>   */
>>  // ============================== HOW TO RUN THIS TEST:
>> ====================================
>> -//(Quick build: mvn -DskipTests=true clean package -pl log4j-perf -am )
>> +// (Quick build: mvn -DskipTests=true clean package -pl log4j-perf -am )
>>  //
>>  // java -jar log4j-perf/target/benchmarks.jar ".*StringEncoding.*" -f 1
>> -wi 5 -i 10
>>  //
>> @@ -63,70 +63,70 @@ public class StringEncodingBenchmark {
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytes() {
>> +    public byte[] defaultStringGetBytes() {
>>          return LOGMSG.getBytes();
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesString88591() throws Exception {
>> +    public byte[] iso8859_1StringGetBytesString() throws Exception {
>>          return LOGMSG.getBytes(STRING_ISO8859_1);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesCharSet88591() {
>> +    public byte[] iso8859_1StringGetBytesCharSet() {
>>          return LOGMSG.getBytes(CHARSET_ISO8859_1);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesStringUsAscii() throws Exception {
>> +    public byte[] usAsciiStringGetBytesString() throws Exception {
>>          return LOGMSG.getBytes(STRING_US_ASCII);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesCharSetUsAscii() {
>> +    public byte[] usAsciiStringGetBytesCharSet() {
>>          return LOGMSG.getBytes(CHARSET_US_ASCII);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesStringDefault() throws Exception {
>> +    public byte[] defaultStringGetBytesString() throws Exception {
>>          return LOGMSG.getBytes(DEFAULT_ENCODING);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesCharSetDefault() {
>> +    public byte[] defaultStringGetBytesCharSet() {
>>          return LOGMSG.getBytes(CHARSET_DEFAULT);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesStringShiftJIS() throws Exception {
>> +    public byte[] shiftJisStringGetBytesString() throws Exception {
>>          return LOGMSG.getBytes(STRING_SHIFT_JIS);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] stringGetBytesCharSetShiftJIS() {
>> +    public byte[] shiftJisStringGetBytesCharSet() {
>>          return LOGMSG.getBytes(CHARSET_SHIFT_JIS);
>>      }
>>
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] encoderShiftJIS() throws CharacterCodingException {
>> +    public byte[] shiftJisEncoder() throws CharacterCodingException {
>>          ByteBuffer buf =
>> ENCODER_SHIFT_JIS.encode(CharBuffer.wrap(LOGMSG));
>>          return buf.array();
>>      }
>> @@ -134,7 +134,7 @@ public class StringEncodingBenchmark {
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] encoderIso8859_1() throws CharacterCodingException {
>> +    public byte[] iso8859_1Encoder() throws CharacterCodingException {
>>          ByteBuffer buf =
>> ENCODER_ISO8859_1.encode(CharBuffer.wrap(LOGMSG));
>>          return buf.array();
>>      }
>> @@ -142,12 +142,135 @@ public class StringEncodingBenchmark {
>>      @Benchmark
>>      @BenchmarkMode(Mode.SampleTime)
>>      @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> -    public byte[] customIso8859_1() throws CharacterCodingException {
>> +    public byte[] iso8859_1CustomCastToByte() throws
>> CharacterCodingException {
>>          final int length = LOGMSG.length();
>>          final byte[] result = new byte[length];
>>          for (int i = 0; i < length; i++) {
>> -            result[i] = (byte) LOGMSG.charAt(i);
>> +            final char c = LOGMSG.charAt(i);
>> +            result[i++] = (byte) c;
>>          }
>>          return result;
>>      }
>> +
>> +    @Benchmark
>> +    @BenchmarkMode(Mode.SampleTime)
>> +    @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> +    public byte[] iso8859_1CustomVerifyAndCast() throws
>> CharacterCodingException {
>> +        final int length = LOGMSG.length();
>> +        final byte[] result = new byte[length];
>> +        int j = 0;
>> +        for (int i = 0; i < length; i++) {
>> +            final char c = LOGMSG.charAt(i);
>> +            if (c <= 255) {
>> +                result[j++] = (byte) c;
>> +            } else {
>> +                i = nonIsoChar(LOGMSG, i);
>> +                result[j++] = (byte) '?';
>> +            }
>> +        }
>> +        return result;
>> +    }
>> +
>> +    private int nonIsoChar(String logmsg, int i) {
>> +        char c = logmsg.charAt(i++);
>> +        if ((Character.isHighSurrogate(c)) && (i < logmsg.length()) &&
>> (Character.isLowSurrogate(logmsg.charAt(i)))) {
>> +            i++;
>> +        }
>> +        return i;
>> +    }
>> +
>> +    @Benchmark
>> +    @BenchmarkMode(Mode.SampleTime)
>> +    @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> +    public byte[] iso8859_1CustomPortedJDK8() throws
>> CharacterCodingException {
>> +        final int length = LOGMSG.length();
>> +        final byte[] result = new byte[length];
>> +        encode(LOGMSG, 0, length, result);
>> +        return result;
>> +    }
>> +
>> +    private static int encodeISOArray(String charArray, int charIndex,
>> byte[] byteArray, int byteIndex, int length) {
>> +        int i = 0;
>> +        for (; i < length; i++) {
>> +            char c = charArray.charAt(charIndex++);
>> +            if (c > 255) {
>> +                break;
>> +            }
>> +            byteArray[(byteIndex++)] = ((byte) c);
>> +        }
>> +        return i;
>> +    }
>> +
>> +    private int encode(String charArray, int charOffset, int charLength,
>> byte[] byteArray) {
>> +        int offset = 0;
>> +        int length = Math.min(charLength, byteArray.length);
>> +        int charDoneIndex = charOffset + length;
>> +        while (charOffset < charDoneIndex) {
>> +            int m = encodeISOArray(charArray, charOffset, byteArray,
>> offset, length);
>> +            charOffset += m;
>> +            offset += m;
>> +            if (m != length) {
>> +                char c = charArray.charAt(charOffset++);
>> +                if ((Character.isHighSurrogate(c)) && (charOffset <
>> charDoneIndex)
>> +                        &&
>> (Character.isLowSurrogate(charArray.charAt(charOffset)))) {
>> +                    if (charLength > byteArray.length) {
>> +                        charDoneIndex++;
>> +                        charLength--;
>> +                    }
>> +                    charOffset++;
>> +                }
>> +                byteArray[(offset++)] = '?';
>> +                length = Math.min(charDoneIndex - charOffset,
>> byteArray.length - offset);
>> +            }
>> +        }
>> +        return offset;
>> +    }
>> +
>> +    @Benchmark
>> +    @BenchmarkMode(Mode.SampleTime)
>> +    @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> +    public byte[] iso8859_1CustomPortedJDK8CopyArray() throws
>> CharacterCodingException {
>> +        char[] charArray = LOGMSG.toCharArray();
>> +        final int length = charArray.length;
>> +        final byte[] result = new byte[length];
>> +        encode0(charArray, 0, length, result);
>> +        return result;
>> +    }
>> +
>> +    private static int encodeISOArray0(char[] charArray, int charIndex,
>> byte[] byteArray, int byteIndex, int length) {
>> +        int i = 0;
>> +        for (; i < length; i++) {
>> +            char c = charArray[(charIndex++)];
>> +            if (c > 255) {
>> +                break;
>> +            }
>> +            byteArray[(byteIndex++)] = ((byte) c);
>> +        }
>> +        return i;
>> +    }
>> +
>> +    private int encode0(char[] charArray, int charOffset, int
>> charLength, byte[] byteArray) {
>> +        int offset = 0;
>> +        int length = Math.min(charLength, byteArray.length);
>> +        int charDoneIndex = charOffset + length;
>> +        while (charOffset < charDoneIndex) {
>> +            int m = encodeISOArray0(charArray, charOffset, byteArray,
>> offset, length);
>> +            charOffset += m;
>> +            offset += m;
>> +            if (m != length) {
>> +                char c = charArray[(charOffset++)];
>> +                if ((Character.isHighSurrogate(c)) && (charOffset <
>> charDoneIndex)
>> +                        &&
>> (Character.isLowSurrogate(charArray[(charOffset)]))) {
>> +                    if (charLength > byteArray.length) {
>> +                        charDoneIndex++;
>> +                        charLength--;
>> +                    }
>> +                    charOffset++;
>> +                }
>> +                byteArray[(offset++)] = '?';
>> +                length = Math.min(charDoneIndex - charOffset,
>> byteArray.length - offset);
>> +            }
>> +        }
>> +        return offset;
>> +    }
>>  }
>>
>>
>>
>>
>> --
>> E-Mail: [email protected] | [email protected]
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>
>

Reply via email to