慢字节[]到String构造函数

时间:2014-04-26 04:13:33

标签: java android string constructor

我正在编写android java应用程序(minSdkVersion 15),以便以json格式从php-site到api获取大学时间表。在使用InflaterInputStream解压缩内容后,我得到了一个UTF-8编码的字节数组,并希望将其转换为字符串,以通过Jackson / GSON或其他库映射到对象。 不幸的是,从一个超过4.000.000字节长的数组构造字符串大约需要10分钟。

String result = new String(resultArray, "UTF-8");

我找到了这篇文章(http://java-performance.info/inefficient-byte-to-string-constructor/) 这可能解决了这个问题,但无法理解。 可能有更好的转换方式吗?

2 个答案:

答案 0 :(得分:0)

嗯,这篇文章的主要观点是Java 6有一个“破碎”的问题。该构造函数的实现,以及在较新版本的Java上问题消失。

例如,我编写了一个快速测试程序,它生成4M随机字节,并使用相同的构造函数将结果数组转换为字符串,但使用Java 8,它非常活泼:

    byte[] arr = new byte[4000000];
    Random r = new Random();
    r.nextBytes(arr);

    long start = System.currentTimeMillis();
    String result = new String(arr, "UTF-8");
    System.out.println(System.currentTimeMillis() - start); // takes ~100 ms

答案 1 :(得分:0)

我们在android上也有类似的问题。 我们并没有那么慢,但是新的String(byte [],“ UTF-8”)正在显示为我们的主要性能问题。

enter image description here

新的String(byte [])正在调用StringFactory.newStringFromBytes(),如您所见,这是列表中最慢的方法。

通过查看代码,您可以看到存在一个“ TODO:本机实现此方法”。 https://android.googlesource.com/platform/libcore/+/master/libart/src/main/java/java/lang/StringFactory.java#77