JDK9 团队努力帮助我们删除非公共(public)依赖项(使用 jdeps
)。我正在使用 Unsafe
类来更快地访问 String
的内部 char
数组 - 而无需创建新的 char 数组。如果我想放弃对 Unsafe
类的依赖,我需要动态加载它并使用反射调用 Unsafe.getObject
和其他方法。
现在我想知道性能:现在当我将反射与 Unsafe
一起使用时,它如何匹配 String.toCharArray
性能?继续使用 Unsafe
是否有意义?
我假设 JDK >= 7。
编辑
是的,我完全知道每个人都可以使用例如 JMH 编写这些测试;但是使用不同的输入和不同的 VM 版本 (7,8) 进行测量需要花费大量时间。所以我想知道是否有人已经这样做了;因为许多库都在使用 Unsafe
。
最佳答案
- 在
String
的 Java 9 版本中有可能根本没有支持char[]
数组,请参阅 JEP 254 .也就是说,toCharArray()
将是您唯一的选择。 - 通常你不应该使用
Unsafe
API,除非你绝对确定它是必要的。但既然你问这个问题,我猜你不是。在我的笔记本电脑上,toCharArray()
在 25 纳秒 内完成了 100 个字符的字符串,也就是说,我每秒可以调用 4000 万次!你真的有这样的工作量吗? - 如果绝对需要,请使用 MethodHandles而不是 Reflection 和 Unsafe。 MethodHandles 与直接字段访问一样快,但与
Unsafe
不同,它们是公共(public)、受支持和安全 API。
关于java - 不安全,反射访问与 toCharArray(性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30952030/