几天前,我在论坛上发了一篇关于
Optional
的文章。其中一条评论是一个非常好的问题:
Optional 的使用会导致性能下降吗?
答案是: 是的,它会的。但是你应该担心吗?
使用Optional的好处
Optional 类使我们这些开发人员的生活更轻松
- 增加代码的可读性
- 减少代码中的条件数
- 更不容易出错
让我们来看看 Optional 类的一些主要方法是如何实现的。
Optional 如何实现的?
这里有一些
Optional
类的主要方法:
基本上,它将值包装到一个新的
Optional
对象中,并检查包装的值是否为
null
。
即使没有使用 Optional,也必须检查值是否为 null。它可能比您做的检查多一些,但我认为您不必担心这一点。
但是您必须知道,将值包装到新对象中将增加 GC 要收集的对象数量。这意味着堆使用量将增加得更快,CPU 使用量将更高(更多 GC 事件)。
好吧,但是有多高呢?同样,这取决于您正在创建的可选对象的数量、堆的大小以及您的应用程序在不使用可选对象的情况下使用的 CPU 数量。
例如,假设您对应用程序进行了基准测试,并得出结论,使用 Optional 将提高 CPU 使用率1个百分点。如果您的应用程序平均使用50% 的 CPU,那么使用51% 的可选 CPU 并不是一个很大的开销,对吧?
但是,如果您的应用程序平均消耗5% 的 CPU,使用6% 意味着20% 的开销,这是相当重要的。
过早优化是万恶之源
Joshua Bloch 在Effective Java 一书中有整整一章(第67项: Optimize judiciously)谈到了优化。
他在这一章的开头写道:
关于最优化,有三个关注点是每个人都应该知道的:与其他任何单一原因(包括盲目的愚蠢)相比,更多的计算原罪是以效率的名义犯下的(不一定能实现)。William A. Wulf我们应该忘记小的副作用,比如说97% 的时间: 过早的优化是一切罪恶的根源。Donald E. Knuth在优化问题上,我们遵循两个规则:M. A. Jackson
- 规则1. 不要这样做
- 规则 2(仅适用于专家)。 暂时不要这样做——也就是说,除非你有一个非常清晰且未经优化的解决方案。
因此,除非您需要一个快速的应用程序并且资源有限,否则不要过早担心性能问题。专注于编写好的代码,这样当你需要它的时候,它就很容易优化。此外,使用分析器查找对性能影响更大的位置。
谁会使用你的 API?
这也是一个你需要问自己的好问题。如果您正在编写一个内部 API,您可以更***地决定是否使用它。
但是如果你正在编写一个公共 API,比如一个框架或者库,而你不知道什么样的应用程序在调用它,你可能需要更加灵活,给客户端选择是否使用可选的选项。
您可以提供两个方法,一个返回
Optional
,另一个返回
null
。但是,当创建一个可以返回
null
的方法时,尽量让它显式。使用注释
javax.annotation.Nullable
。方法的可空性。 (JSR 305)
最终,这取决于你
你可以决定是否使用 Optional。没有一个简单的答案适用于所有情况。软件工程中的大多数事情都是这样的。这一切都是权衡取舍。
所以,要意识到它是如何工作的,并评估替代方案。任何事情都有代价,你是那个可以决定是否承担的人。
您认为为了提高性能而付出不可读且更容易出错的代码的代价是值得的吗?你知道这种进步有多重要吗?
在大多数情况下,使用
Optional
并保持开心!
Optional
是不错的!