通过使用公共变量来提高性能?
Posted
技术标签:
【中文标题】通过使用公共变量来提高性能?【英文标题】:Performance enhancements through use of public variables? 【发布时间】:2018-01-20 02:59:07 【问题描述】:关于 Java,我非常习惯于将我的所有变量声明为私有并生成公共 getter 和 setter 以遵守通用约定。
不过,我觉得这很奇怪:对于除了分配和返回请求值之外没有其他功能的 getter 和 setter,调用以下方法是否不会影响性能:
String getValue()
return value;
代替:
classInstance.value;
编译器是否在这里做一些事情来帮助防止函数调用添加额外的循环?如果不是,那么在更强大的应用程序中,这种理论上的命中是否会滚雪球?
编辑:: 为了澄清起见,这个问题并不是问为什么应该或不应该使用访问器方法,问题是使用访问器是否会影响性能。
【问题讨论】:
非常广泛的问题,但一般不要使用微优化,干净的可读性更重要。 在任何足够复杂的程序的范围内,我认为开销可以忽略不计 我不认为它太宽泛了。使用公共变量定义 getter 和 setter 方法是否会在 Java 中增加额外的工作周期?就个人而言,我不认为 classInstance.getValue() 的可读性比 classInstance.value 差; @anomeric 嗯,there are actually many good reasons to consider using accessors. 这真是一个来自另一个时代的问题。现在让程序变慢的是数据库缓存、多线程和性能扩展等问题 【参考方案1】:编译器是否在这里做一些事情来帮助防止函数调用添加额外的循环?
是的。
Hotspot JIT 编译器将内联短方法,一个简单的 getter 或 setter 就足够短了。内联方法体摆脱了参数组装和方法调用的开销,并允许在调用方法的上下文中进行进一步的局部优化。
最终结果是,使用 getter 和 setter 不会影响现代 JVM(tm) 的性能
(一些早期的 android 编译器没有这样做,但已经纠正了。)
【讨论】:
感谢您实际解决这个问题。【参考方案2】:我不知道 Java 是否会做类似的事情,但 C++ 可以内联这种东西。
我也喜欢使用 getter 和 setter,但它们比普通变量慢。
因此,如果您正在创建 API,请使用 getter 和 setter;如果您需要性能,请选择公共变量,而可读性并不那么重要。
【讨论】:
不可能说getter更慢,代码高执行时JMV优化 我曾经做过一个实验,发现 getter 和 setter 比较慢。但这可能已经有所改善。 如果您的实验显示任何最新版本的 Java 都存在可衡量的差异,那么您的基准测试技术很可能存在问题。以上是关于通过使用公共变量来提高性能?的主要内容,如果未能解决你的问题,请参考以下文章