通过使用公共变量来提高性能?

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 都存在可衡量的差异,那么您的基准测试技术很可能存在问题。

以上是关于通过使用公共变量来提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

有效提高ThinkPHP的应用性能的几点建议

如何提高包含部分公共子查询的 SQL 查询性能

如何通过并行处理数据库结果来提高性能?

通过使用 AVX 内部函数重写来提高 math.h 函数的性能

(36)C#使用引用(ref)来提高程序的性能

Kong入门指南 - 通过代理缓存提高性能