几天前,我在论坛上发了一篇关于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. 【NX二次开发】Block UI 选择小平面区域

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  2. ipconfig提示不是内部或外部命令

    昨天因为公司断网,重新连上之后ip地址变了,于是就想看看现在的ip是什么 输入ipconfig,回车 提示不是外部和内部命令,是因为系统在本路径下未找到ipconfig.exe系统,所以无法识别ipc ...

  3. Spring Boot WebFlux-10——WebFlux 实战图书管理系统

    前言 本篇内容我们会实现如下图所示的城市管理系统,因为上面案例都用的是 City,所以这里直接使用城市作为对象,写一个简单的城市管理系统,如图所示: 结构 类似上面讲的工程搭建,新建一个工程编写此案例 ...

  4. 老公 今晚还玩“丝袜哥”Swagger 么?

    大家都知道Swagger是一个常用的Spring Boot接口文档生成工具,但是我们今天再介绍另外一个无需额外注解的 Spring Boot API文档生成神器,非常方便好用! JApiDocs是一个 ...

  5. 『无为则无心』Python基础 — 10、Python字符串的格式化输出

    目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...

  6. golang中的defer和return的执行顺序

    结论 go中是先给return准备返回值,再根据defer先进后出的规则执行,最后将返回值返回给调用者 测试用例1验证分析 代码片段如下: func foo_1() (err error) { def ...

  7. Keepalive介绍及工作原理

    注:keepalive和Nginx和高可用没有关联. 1.什么是高可用,为什么要设计高可用? 1.两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将国称之为高可用.2.系统可用率算法 ...

  8. 35、sudo权限设置

    提示:sudo的介绍在"13.linux中用户和用户组"中有详细介绍: (1)简历里要加上如下项目经验: 服务器用户权限管理改造方案与实施项目 日期: 在了解公司业务流程后,提出权 ...

  9. 本地无法访问虚拟机的tomcat

    查看 firewalld防火墙 是否开启 命令: firewall-cmd --state 如果是 running 关闭 firewalld防火墙命令: service firewalld stop  ...

  10. redis-list实现

    Redis 数据结构---链表 Redis的list底层实现使用的不是数组而是链表的数据结构 叫listnode  是一个双向链表 ListNode{ Struct listNode *prev  / ...