不安全,反射访问与字符数组(性能)



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

现在

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

我假设 JDK>= 7。

编辑

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

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

最新更新