Java:Getter 和 setter 比直接访问更快?
我测试了我正在Linux Netbook上使用VisualVM 1.3.7编写的Java光线跟踪器的性能。我用分析器测量。
为了好玩,我测试了使用 getter 和 setter 与直接访问字段之间是否存在差异。getters 和 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%?