java - 不安全,反射访问与 toCharArray(性能)

标签 java performance

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

现在我想知道性能:现在当我将反射与 Unsafe 一起使用时,它如何匹配 String.toCharArray 性能?继续使用 Unsafe 是否有意义?

我假设 JDK >= 7。

编辑

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

最佳答案

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

关于java - 不安全,反射访问与 toCharArray(性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30952030/

相关文章:

java - Selenium Webdriver - 使用 Java 8 从数据表中获取列

Java:在双重检查成语中使用局部变量

python - 如何替换数据框每行中大于特定阈值的前 n 个元素

java - 获取字符集时流关闭错误

java - java.util.logging.Logger 方法是否会在 Google App Engine 上失败?

c# - 测试显示 "await"明显更慢,即使等待的对象已经完成

c# - 为什么相同的算法在 Scala 中的运行速度比在 C# 中慢得多?以及如何让它更快?

performance - 连接两组节点的高效密码查询匹配子图

java - 如何操作Object[]的ArrayList?

performance - Javascript、IE、字符串和性能问题