8231717: Improve performance of charset decoding when charset is always compactable
Reviewed-by: rriggs, redestad, alanb
This commit is contained in:
parent
4ad3d82c76
commit
0dbfc97c05
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -48,7 +48,7 @@ public class $NAME_CLZ$ extends Charset implements HistoricallyNamedCharset
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CharsetDecoder newDecoder() {
|
public CharsetDecoder newDecoder() {
|
||||||
return new SingleByte.Decoder(this, b2c, $ASCIICOMPATIBLE$);
|
return new SingleByte.Decoder(this, b2c, $ASCIICOMPATIBLE$, $LATIN1DECODABLE$);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharsetEncoder newEncoder() {
|
public CharsetEncoder newEncoder() {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -46,6 +46,7 @@ public class SBCS {
|
|||||||
String hisName = cs.hisName;
|
String hisName = cs.hisName;
|
||||||
String pkgName = cs.pkgName;
|
String pkgName = cs.pkgName;
|
||||||
boolean isASCII = cs.isASCII;
|
boolean isASCII = cs.isASCII;
|
||||||
|
boolean isLatin1Decodable = true;
|
||||||
|
|
||||||
StringBuilder b2cSB = new StringBuilder();
|
StringBuilder b2cSB = new StringBuilder();
|
||||||
StringBuilder b2cNRSB = new StringBuilder();
|
StringBuilder b2cNRSB = new StringBuilder();
|
||||||
@ -69,6 +70,9 @@ public class SBCS {
|
|||||||
c2bOff += 0x100;
|
c2bOff += 0x100;
|
||||||
c2bIndex[e.cp>>8] = 1;
|
c2bIndex[e.cp>>8] = 1;
|
||||||
}
|
}
|
||||||
|
if (e.cp > 0xFF) {
|
||||||
|
isLatin1Decodable = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Formatter fm = new Formatter(b2cSB);
|
Formatter fm = new Formatter(b2cSB);
|
||||||
@ -178,6 +182,9 @@ public class SBCS {
|
|||||||
if (line.indexOf("$ASCIICOMPATIBLE$") != -1) {
|
if (line.indexOf("$ASCIICOMPATIBLE$") != -1) {
|
||||||
line = line.replace("$ASCIICOMPATIBLE$", isASCII ? "true" : "false");
|
line = line.replace("$ASCIICOMPATIBLE$", isASCII ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
if (line.indexOf("$LATIN1DECODABLE$") != -1) {
|
||||||
|
line = line.replace("$LATIN1DECODABLE$", isLatin1Decodable ? "true" : "false");
|
||||||
|
}
|
||||||
if (line.indexOf("$B2CTABLE$") != -1) {
|
if (line.indexOf("$B2CTABLE$") != -1) {
|
||||||
line = line.replace("$B2CTABLE$", b2c);
|
line = line.replace("$B2CTABLE$", b2c);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -191,6 +191,12 @@ class StringCoding {
|
|||||||
return result.with(StringLatin1.inflate(ba, off, len), UTF16);
|
return result.with(StringLatin1.inflate(ba, off, len), UTF16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// fastpath for always Latin1 decodable single byte
|
||||||
|
if (COMPACT_STRINGS && cd instanceof ArrayDecoder && ((ArrayDecoder)cd).isLatin1Decodable()) {
|
||||||
|
byte[] dst = new byte[len];
|
||||||
|
((ArrayDecoder)cd).decodeToLatin1(ba, off, len, dst);
|
||||||
|
return result.with(dst, LATIN1);
|
||||||
|
}
|
||||||
int en = scale(len, cd.maxCharsPerByte());
|
int en = scale(len, cd.maxCharsPerByte());
|
||||||
char[] ca = new char[en];
|
char[] ca = new char[en];
|
||||||
if (cd instanceof ArrayDecoder) {
|
if (cd instanceof ArrayDecoder) {
|
||||||
@ -278,6 +284,13 @@ class StringCoding {
|
|||||||
((ArrayDecoder)cd).isASCIICompatible() && !hasNegatives(ba, off, len)) {
|
((ArrayDecoder)cd).isASCIICompatible() && !hasNegatives(ba, off, len)) {
|
||||||
return decodeLatin1(ba, off, len);
|
return decodeLatin1(ba, off, len);
|
||||||
}
|
}
|
||||||
|
// fastpath for always Latin1 decodable single byte
|
||||||
|
if (COMPACT_STRINGS && cd instanceof ArrayDecoder && ((ArrayDecoder)cd).isLatin1Decodable()) {
|
||||||
|
byte[] dst = new byte[len];
|
||||||
|
((ArrayDecoder)cd).decodeToLatin1(ba, off, len, dst);
|
||||||
|
return new Result().with(dst, LATIN1);
|
||||||
|
}
|
||||||
|
|
||||||
int en = scale(len, cd.maxCharsPerByte());
|
int en = scale(len, cd.maxCharsPerByte());
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return new Result().with();
|
return new Result().with();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -28,6 +28,9 @@ package sun.nio.cs;
|
|||||||
/*
|
/*
|
||||||
* FastPath byte[]->char[] decoder, REPLACE on malformed or
|
* FastPath byte[]->char[] decoder, REPLACE on malformed or
|
||||||
* unmappable input.
|
* unmappable input.
|
||||||
|
*
|
||||||
|
* FastPath encoded byte[]-> "String Latin1 coding" byte[] decoder for use when
|
||||||
|
* charset is always decodable to the internal String Latin1 coding byte[], ie. all mappings <=0xff
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface ArrayDecoder {
|
public interface ArrayDecoder {
|
||||||
@ -36,4 +39,14 @@ public interface ArrayDecoder {
|
|||||||
default boolean isASCIICompatible() {
|
default boolean isASCIICompatible() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Is always decodable to internal String Latin1 coding, ie. all mappings <= 0xff
|
||||||
|
default boolean isLatin1Decodable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode to internal String Latin1 coding byte[] fastpath for when isLatin1Decodable == true
|
||||||
|
default int decodeToLatin1(byte[] src, int sp, int len, byte[] dst) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -50,17 +50,27 @@ public class SingleByte
|
|||||||
implements ArrayDecoder {
|
implements ArrayDecoder {
|
||||||
private final char[] b2c;
|
private final char[] b2c;
|
||||||
private final boolean isASCIICompatible;
|
private final boolean isASCIICompatible;
|
||||||
|
private final boolean isLatin1Decodable;
|
||||||
|
|
||||||
public Decoder(Charset cs, char[] b2c) {
|
public Decoder(Charset cs, char[] b2c) {
|
||||||
super(cs, 1.0f, 1.0f);
|
super(cs, 1.0f, 1.0f);
|
||||||
this.b2c = b2c;
|
this.b2c = b2c;
|
||||||
this.isASCIICompatible = false;
|
this.isASCIICompatible = false;
|
||||||
|
this.isLatin1Decodable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Decoder(Charset cs, char[] b2c, boolean isASCIICompatible) {
|
public Decoder(Charset cs, char[] b2c, boolean isASCIICompatible) {
|
||||||
super(cs, 1.0f, 1.0f);
|
super(cs, 1.0f, 1.0f);
|
||||||
this.b2c = b2c;
|
this.b2c = b2c;
|
||||||
this.isASCIICompatible = isASCIICompatible;
|
this.isASCIICompatible = isASCIICompatible;
|
||||||
|
this.isLatin1Decodable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Decoder(Charset cs, char[] b2c, boolean isASCIICompatible, boolean isLatin1Decodable) {
|
||||||
|
super(cs, 1.0f, 1.0f);
|
||||||
|
this.b2c = b2c;
|
||||||
|
this.isASCIICompatible = isASCIICompatible;
|
||||||
|
this.isLatin1Decodable = isLatin1Decodable;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {
|
private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {
|
||||||
@ -124,6 +134,18 @@ public class SingleByte
|
|||||||
repl = newReplacement.charAt(0);
|
repl = newReplacement.charAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int decodeToLatin1(byte[] src, int sp, int len, byte[] dst) {
|
||||||
|
if (len > dst.length)
|
||||||
|
len = dst.length;
|
||||||
|
|
||||||
|
int dp = 0;
|
||||||
|
while (dp < len) {
|
||||||
|
dst[dp++] = (byte)decode(src[sp++]);
|
||||||
|
}
|
||||||
|
return dp;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int decode(byte[] src, int sp, int len, char[] dst) {
|
public int decode(byte[] src, int sp, int len, char[] dst) {
|
||||||
if (len > dst.length)
|
if (len > dst.length)
|
||||||
@ -143,6 +165,11 @@ public class SingleByte
|
|||||||
public boolean isASCIICompatible() {
|
public boolean isASCIICompatible() {
|
||||||
return isASCIICompatible;
|
return isASCIICompatible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLatin1Decodable() {
|
||||||
|
return isLatin1Decodable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Encoder extends CharsetEncoder
|
public static final class Encoder extends CharsetEncoder
|
||||||
|
Loading…
Reference in New Issue
Block a user