gpt4 book ai didi

Java:getter 和 setter 比直接访问更快?

转载 作者:IT老高 更新时间:2023-10-28 20:44:52 25 4
gpt4 key购买 nike

我用 VisualVM 测试了我正在编写的 Java 光线追踪器的性能。 1.3.7 在我的 Linux 上网本上。我用 profiler 测量了。
为了好玩,我测试了使用 getter 和 setter 与直接访问字段之间是否有区别。 getter 和 setter 是标准代码,没有添加。

我没想到会有任何差异。但是直接访问代码比较慢。

这是我在 Vector3D 中测试的示例:

public float dot(Vector3D other) {
return x * other.x + y * other.y + z * other.z;
}

时间:1542 毫秒/1,000,000 次调用

public float dot(Vector3D other) {
return getX() * other.getX() + getY() * other.getY() + getZ() * other.getZ();
}

时间:1453 毫秒/1,000,000 次调用

我没有在微基准测试中测试它,而是在光线追踪器中测试它。我测试代码的方式:

  • 我使用第一个代码启动程序并进行了设置。光线追踪器尚未运行。
  • 我启动了分析器并在初始化完成后等待了一段时间。
  • 我启动了光线追踪器。
  • 当 VisualVM 显示足够多的调用时,我停止了分析器并稍等片刻。
  • 我关闭了光线追踪程序。
  • 我用第二个代码替换了第一个代码,并在编译后重复上述步骤。

我至少为这两个代码运行了 20,000,000 次调用。我关闭了任何我不需要的程序。我将 CPU 设置为性能,因此我的 CPU 时钟处于最大状态。一直都在。
第二个代码怎么可能快 6%?

最佳答案

我确实用大量的 JVM 预热做了一些微基准测试,发现 这两种方法所花费的执行时间完全相同

发生这种情况是因为 JIT 编译器将 getter 方法内联并直接访问该字段,从而使它们成为相同的字节码。

关于Java:getter 和 setter 比直接访问更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com