Markus Gaisbauer a écrit :
A bug in java.lang.StringCoding causes a full and unnecessary copy of
the byte array given as the first argument.
it's not a bug, it's a feature :)
i think this copy is a defensive copy to avoid malicious charser (decoder) to
access the underlying buffer.

By the way, using clone() seams better than Arrays.copyOf() here.

byte[] b = ba.clone();


This results in severe slow down of the Constructor if the byte array is
big.
Rémi
The attached patch, should fix the problem.


Unfortunately I do not (yet) have an official bug id for this, as this
seems to take a while (reported 2 weeks ago).

To reproduce the problem run the following test program:

import java.nio.charset.Charset;

public class StringTest {

       public static void main(String[] args) throws Exception {
               long before;
               long after;
               byte[] data;

               data = new byte[1024*1024*16]; // 16 megabyte
               data[0] = 'X';

               // warmup
               new String(data, 0, 1);
               new String(data, 0, 1, Charset.forName("UTF8"));
               new String(data, 0, 1, "UTF8");

               before = System.nanoTime();
               new String(data, 0, 1);
               after = System.nanoTime();
               System.out.println((after - before) / 1000000 + "ms");

               before = System.nanoTime();
               new String(data, 0, 1, Charset.forName("UTF8"));
               after = System.nanoTime();
               System.out.println((after - before) / 1000000 + "ms");

               before = System.nanoTime();
               new String(data, 0, 1, "UTF8");
               after = System.nanoTime();
               System.out.println((after - before) / 1000000 + "ms");
       }

}
------------------------------------------------------------------------

Index: StringCoding.java
===================================================================
--- StringCoding.java   (revision 258)
+++ StringCoding.java   (working copy)
@@ -193,7 +193,6 @@
static char[] decode(Charset cs, byte[] ba, int off, int len) {
         StringDecoder sd = new StringDecoder(cs, cs.name());
-        byte[] b = Arrays.copyOf(ba, ba.length);
         return sd.decode(b, off, len);
     }

Reply via email to