Thanks for the 5 minutes:-)
Your FindXYZcoderBugs tests are indeed very helpful to catch most of the
"inconsistent" behaviors
between different paths by feeding the "random" inputs.
The TestIBMDB.java is diffing the behaviors of old implementation and
new implementation
with all "decode-able" bytes and "encode-able" chars...so it gives us
some of the guarantee.
Oh, the typos are being fixed:-)
Sherman
Martin Buchholz wrote:
5-minute review.
Looks pretty good.
Thanks for fixing old bugs found by FindXXcoderBugs.java
Thanks Ulf for your hard work on implementation and review.
Again, charset changes are very hard to review, hence scary,
but relatively easy to test in an automated fashion.
I imagine generating tests with
random input,
random charset,
random choice of direct/non-direct buffers,
and checking that charset behavior is unchanged
except for performance.
---
// it's time to generate the class file
Confusing - you're generating a source file,
and the phrase "class file" usually means
XX.class
typos:
typitcal
date structure.
correspoinding
ruondtrip
*file dbcs has trailing newlines
*Martin
On Wed, May 20, 2009 at 15:22, Xueming Shen <[email protected]
<mailto:[email protected]>> wrote:
Ulf, thanks for the review!
Now we have a bugid for this one. The webrev has been updated to
address some of your
suggestions (see my below) and rename to
http://cr.openjdk.java.net/~sherman/6843578/webrev
<http://cr.openjdk.java.net/%7Esherman/6843578/webrev>
(old webrevs are still there with webrev.0x)
With this change,
(1)21% reduce of rt.jar size (from 2.99M-with the euc_tw reduce to
2.35M)
(2)much faster coding performance, a quick/not_really_a_benchmark
result can been found at
http://cr.openjdk.java.net/~sherman/6843578/codingPerm
<http://cr.openjdk.java.net/%7Esherman/6843578/codingPerm>
(3)also addressed the bugids listed below.
6639450: IBM949C encoder modifies state of IBM949 encoder
6569191: Cp943 io converter returns U+0000 and U+FFFD for
unconvertable character
6577466: Character encoder IBM970 throws a BufferOverflowException
5065777: CharsetEncoder canEncode() methods often incorrectly
return false
The test case test/sun/nio/cs/OLD/TestIBMDB.java is used to make
sure there is no mapping
regression, there are new mapping entries added (because switching
to the latest IBM cdc
mapping tables for some charsets, which the b2c tables we have are
not accurate/complete), but
no conflit with previous mappings.
Alan, Martin, I need you guys also help review the change, I will
need a name on the putback message.
The number of file is huge, but only the files listed at beginning
need attention:-)
Sherman
Ulf Zibis wrote:
*** Decoder-Suggestions:
(1) Unused imports in DoubleByte-X.java:
import java.util.Arrays;
import sun.nio.cs.StandardCharsets;
import static sun.nio.cs.CharsetMapping.*;
import sun.nio.cs.ext.DoubleByte; // or instead: static
sun.nio.cs.ext.DoubleByte.*;
done! good catch.
(3) Modify dimension of b2c:
char[][] b2c = new char[0x100][segSize];
so decode :
public char decodeDouble(int b1, int b2) {
if ((b2-=b2Min) < 0 || b2 >= segSize)
return UNMAPPABLE_DECODING;
return b2c[b1][b2];
}
Benefit[1]: increase performance of decoder
Benefit[2]: reduce memory of B2C_UNMAPPABLE from 8192 to 512
bytes
Benefit[3]: some of b2c pages could be saved (if only
containing \uFFFD)
A good suggestion. I tried, and it does bring in about 10%+% gain
of decoding (for non-direct buffer,
we also have similar gian in direct buffer, but the % number is
not this big). The webrev has been updated
for this one.
(4) Don't care about b2Max (it's always not far from 0xff):
Benefit[4]: another performance increase of decoder (only
check: (b2-=b2Min) < 0)
Decided to keep it. We do have some charsets (not included this
time) that care about b2max.
(5) Truncate String segments (there are 65 % "\uFFFD" in IBM933):
(fill b2c segments first with "\uFFFD", then initialize)
Benefit[5]: save up to 180 % superfluous memory and
disk-footprint
Changing from the b2c index from 4-bit to 8-bit (#2) should have
already improved this a lot (I see
a 1.5%+ improvement of overall charsets.jar)
(6) Unload b2cStr from memory after startup:
- outsource b2cStr to additional class file like EUC_TW approach
- set b2cStr = null after startup (remove final modifier)
Benefit[6]: avoid 100 % superfluous memory-footprint
I doubt it really saves something real, since the "class" should
still keep its copy somewhere...and
I will need it for c2b (now I'm "delaying" the c2b init)
(7) Avoid copying b2cStr to b2c:
(String#charAt() is fast as char[] access)
Benefit[7]: increase startup performance for decoder
I tried again last night. char[][] is much faster than the
String[] version in both client
and server vm. So keep it asis. (this was actually I switched from
String[] to char[][])
(9) Share mappings (IBM930 and IBM939 are 99 % identical):
Benefit[9]: save up to 99 % superfluous disk-footprint
Benefit[10]: save up to 99 % superfluous memory-footprint (if
both charsets are loaded)
I still want to keep one map for one charset, at least for now. It
might be something worth researching
in the future.
(12) Get rid of sun.io <http://sun.io> package dependency:
https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/tags/milestone2/src/sun/io/
Benefit[13]: avoid superfluous disk-footprint
Benefit[14]: save maintenance of sun.io <http://sun.io>
converters
Disadvantage[1]: published under JRL (waiting for launch of
OpenJDK-7 project "charset-enhancement") ;-)
This is not something about engineering. It's about license,
policy...
(17) Decoder#decodeArrayLoop: shortcut for single byte only:
int sr = src.remaining();
int sl = sp + sr;
int dr = dst.remaining();
int dl = dp + dr;
// single byte only loop
int slSB = sp + sr < dr ? sr : dr;
while (sp < slSB) {
char c = b2cSB[sa[sp] && 0xff];
if (c == UNMAPPABLE_DECODING)
break;
da[dp++] = c;
sp++;
}
Same for Encoder#encodeArrayLoop
(18) Decoder_EBCDIC: boolean singlebyteState:
if (singlebyteState)
...
(19) Decoder_EBCDIC: decode single byte first:
if (singlebyteState)
c = b2cSB[b1];
if (c == UNMAPPABLE_DECODING) {
...
}
Benefit[20]: should be faster
Not like when we dealing with singlebyte charsets. For doublebyte
charsets
the priority should be given to doublebyte codepoints, if
possible. Not single
byte codepoints.
*** Encoder-Suggestions:
(21) join *.nr to *.c2b files (25->000a becomes 000a->fffd):
Benefit[21]: reduce no. of files
Benefit[22]: simplifies initC2B() (avoids 2 loops)
In theory you can do some magic to "join" .nr into .c2b. The price
might be more complicated
logic depends on the codepoints. You may end up doing some table
lookup for each codepoint
in b2c when processing.
And big thanks for all the suggestions.