我正在编写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/) 这可能解决了这个问题,但无法理解。 可能有更好的转换方式吗?
答案 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”)正在显示为我们的主要性能问题。
新的String(byte [])正在调用StringFactory.newStringFromBytes(),如您所见,这是列表中最慢的方法。
通过查看代码,您可以看到存在一个“ TODO:本机实现此方法”。 https://android.googlesource.com/platform/libcore/+/master/libart/src/main/java/java/lang/StringFactory.java#77