不安全的反射访问与toCharArray(性能)

时间:2015-06-20 08:38:48

标签: java performance

JDK9团队致力于帮助我们删除非公共依赖项(使用jdeps)。我使用Unsafe类来更快地访问String内部char数组 - 而不创建新的char数组。如果我想放弃对Unsafe类的依赖,我需要动态加载它并使用反射调用Unsafe.getObject和其他方法。

现在我想知道表演:现在当我使用Unsafe的反射时,它是如何与String.toCharArray表演相匹配的?继续使用Unsafe是否有意义?

我假设JDK> = 7。

修改

是的,我完全知道每个人都可以使用例如JMH编写这些测试;但是需要花费大量时间来测量不同的输入和不同的VM版本(7,8)。所以我想知道是否有人已经这样做了;因为许多图书馆正在使用Unsafe

1 个答案:

答案 0 :(得分:3)

  1. 在{9}的Java 9版本中,有可能根本没有支持char[]数组,请参阅JEP 254。也就是说,String将是您唯一的选择。
  2. 一般情况下,除非您完全确定是必要的,否则不应使用toCharArray() API。但既然你问这个问题,我想你不是。在我的笔记本电脑上,Unsafe以25 纳秒完成100个字符串,即我可以每秒拨打4000万次!你真的有这种工作量吗?
  3. 如果绝对需要,请使用MethodHandles代替反射和不安全。 MethodHandles与直接字段访问一样快,但与toCharArray()不同,它们是 public 支持安全 API。