几天前,我在论坛上发了一篇关于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

在优化问题上,我们遵循两个规则:

  • 规则1. 不要这样做
  • 规则 2(仅适用于专家)。 暂时不要这样做——也就是说,除非你有一个非常清晰且未经优化的解决方案。

M. A. Jackson

因此,除非您需要一个快速的应用程序并且资源有限,否则不要过早担心性能问题。专注于编写好的代码,这样当你需要它的时候,它就很容易优化。此外,使用分析器查找对性能影响更大的位置。

谁会使用你的 API?

这也是一个你需要问自己的好问题。如果您正在编写一个内部 API,您可以更自由地决定是否使用它。

但是如果你正在编写一个公共 API,比如一个框架或者库,而你不知道什么样的应用程序在调用它,你可能需要更加灵活,给客户端选择是否使用可选的选项。

您可以提供两个方法,一个返回 Optional ,另一个返回 null。但是,当创建一个可以返回 null 的方法时,尽量让它显式。使用注释 javax.annotation.Nullable。方法的可空性。 (JSR 305)

最终,这取决于你

你可以决定是否使用 Optional。没有一个简单的答案适用于所有情况。软件工程中的大多数事情都是这样的。这一切都是权衡取舍。

所以,要意识到它是如何工作的,并评估替代方案。任何事情都有代价,你是那个可以决定是否承担的人。

您认为为了提高性能而付出不可读且更容易出错的代码的代价是值得的吗?你知道这种进步有多重要吗?

在大多数情况下,使用 Optional 并保持开心!Optional 是不错的!

Optional 的使用会导致性能下降吗?的更多相关文章

  1. MySQL字符集不一致导致性能下降25%,你敢信?

    故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...

  2. jvm的代码缓存耗尽导致性能下降

    在没遇到这个问题之前,我对JVM的解释模式与编译模式的代码性能相差有多大,是没有感觉的,只是觉得编译模式会比解释模式性能好那么一点点吧. 但是经历过这次以后,让我对JVM的即时编译产生了兴趣.先来看看 ...

  3. SQL Server ->> 性能调优案例之 -- 包含递归查询的视图导致整个查询语句性能下降

    有个语句最近性能下降很厉害,原本1秒就可以查询完毕的事情现在居然需要3-4分钟. 首先我的做法是先快速找出导致整个语句下降的元凶.在这个例子里面查询语句有3个JOIN字句,我通过删除某一个JOIN节点 ...

  4. Oracle迁移到MySQL性能下降的注意点(转)

    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障.在我的记忆里面淘宝最初从Oracle ...

  5. MySQL 5.7 分区表性能下降的案例分析

    转载自:https://mp.weixin.qq.com/s/K3RpSBAIWFwGCIWyfF0QPA 前言:希望通过本文,使MySQL5.7.18的使用者知晓分区表使用中存在的陷阱,避免在该版本 ...

  6. 一个MySQL 5.7 分区表性能下降的案例分析

    告知MySQL5.7.18的使用者分区表使用中存在的陷阱,避免在该版本上继续踩坑.同时通过对源码的讲解,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的 ...

  7. (转)一个MySQL 5.7 分区表性能下降的案例分析

    一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...

  8. 使用Django.core.cache操作Memcached导致性能不稳定的分析过程

    使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...

  9. 4.性能下降原因和常见的Join查询

    性能下降 SQL慢,执行时间长,等待时间长 1.查询语句写的烂 2.索引失效 单值索引失效 和 复合索引失效 3.关联查询太多join(设计缺陷或不得已的需求) 4.服务器调优及各个参数设置(缓冲.线 ...

随机推荐

  1. 如何安装/导入Arduino库文件及库文件的不同位置与区别(以eFLL中嵌入式模糊逻辑库为例)

    网上有数百个可在Aruduino中使用的库,这些代码集使得我们无需从0-1地搭建我们所需功能,这使得学习和使用Arduino变得更加方便简单.除此之外,平时直接从网上download下的代码也很有可能 ...

  2. sql优化_隐式-显示转换

    ========  测试表1信息   =======SQL> select count(*) from tb_test; COUNT(*)----------   3000000   SQL&g ...

  3. Java Object类中toString方法的重写

    Object类中的tostring方法的: 当我们输出一个对象时,实际是输出的是这个类中的tostring方法,是一个地址值,而不是类中的属性. 1 一:子类没有重写Object类中的toStrinn ...

  4. android小技巧之点击两次退出活动

    通常在主活动中可以设置连击退出程序,下面通过代码来实现这一功能: @Override//按两次back键退出public boolean onKeyDown(int keyCode, KeyEvent ...

  5. UF_DRAW 制图操作

    Open C uc6476uc6477uc6478uc6479uc6480uc6481uc6482uc6483uc6484uc6485uc6486uc6488uc6489uc6492uc6494uc6 ...

  6. 12:media配置以及后端指定资源暴露

    django需要用到的静态文件默认都是放在static目录下 而针对后期用户上传的静态文件也应该统一存储 # media配置:规定用户上传的静态文件存储位置 MEDIA_ROOT = os.path. ...

  7. java变量及常量

    变量 本质:就是代表一个"可操作的存储空间",空间位置是确定的,但是里面放置什么值不确定.我们可通过变量名来访问"对应的存储空间",从而操纵这个"存储 ...

  8. Linux 之 deb 包生成、安装、卸载

    Linux 之 deb 包的生成.安装和卸载 deb DEB 是 Debian 软件包格式的文件扩展名,是 Unixar 的标准归档,将包文件信息以及包内容,经过 gzip 和 tar 打包而成. d ...

  9. 2.QT浏览器控件设置“透明颜色”

    使用样式表或者设置背景颜色,使用 background-color:transparent 但,使用透明的颜色是不可行的: QColor(255,0,0,0)

  10. 13.9示例:有理数Rational类

    要点提示:java提供了表示整数和浮点数的数据类型,但是没有提供表示有理数的数据类型. public Rational extends Number implements Comparable {}