通过使用 public 变量提高性能?
Performance enhancements through use of public variables?
关于 Java,我非常习惯将所有变量声明为私有并生成 public getter 和 setter 以符合通用约定。
不过,我觉得很好奇:对于除了分配和返回请求值之外没有任何功能的 getter 和 setter,调用方法是否不会影响性能,例如:
String getValue() {
return value;
}
而不是:
classInstance.value;
编译器是否在这里做了一些事情来帮助防止函数调用添加额外的循环?如果不是,那么这个理论上的命中率是否会在更健壮的应用程序中大获成功?
编辑::
为了澄清,这个问题不是问你为什么应该或不应该使用访问器方法,问题是使用访问器是否会影响性能。
我不知道 Java 是否会做类似的事情,但 C++ 可以内联这类事情。
我也喜欢使用 getter 和 setter,但它们比普通变量慢。
因此,如果您要创建 API,请选择 getter 和 setter,如果您需要性能和可读性,则选择 public 变量。
Does the compiler do something here to help keep the function call from adding an extra cycle?
是的。
Hotspot JIT 编译器将内联短方法,简单的 getter 或 setter 就足够短了。内联方法体摆脱了参数组装和方法调用的开销,并允许在调用方法的上下文中进一步进行局部优化。
最终结果是使用 getters 和 setters 不会影响现代 JVM(tm)
的性能
(一些早期的 Android 编译器没有这样做,但这已经被纠正。)
关于 Java,我非常习惯将所有变量声明为私有并生成 public getter 和 setter 以符合通用约定。
不过,我觉得很好奇:对于除了分配和返回请求值之外没有任何功能的 getter 和 setter,调用方法是否不会影响性能,例如:
String getValue() {
return value;
}
而不是:
classInstance.value;
编译器是否在这里做了一些事情来帮助防止函数调用添加额外的循环?如果不是,那么这个理论上的命中率是否会在更健壮的应用程序中大获成功?
编辑:: 为了澄清,这个问题不是问你为什么应该或不应该使用访问器方法,问题是使用访问器是否会影响性能。
我不知道 Java 是否会做类似的事情,但 C++ 可以内联这类事情。
我也喜欢使用 getter 和 setter,但它们比普通变量慢。
因此,如果您要创建 API,请选择 getter 和 setter,如果您需要性能和可读性,则选择 public 变量。
Does the compiler do something here to help keep the function call from adding an extra cycle?
是的。
Hotspot JIT 编译器将内联短方法,简单的 getter 或 setter 就足够短了。内联方法体摆脱了参数组装和方法调用的开销,并允许在调用方法的上下文中进一步进行局部优化。
最终结果是使用 getters 和 setters 不会影响现代 JVM(tm)
的性能(一些早期的 Android 编译器没有这样做,但这已经被纠正。)