Optional 的使用会导致性能下降吗?
几天前,我在论坛上发了一篇关于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 的使用会导致性能下降吗?的更多相关文章
- MySQL字符集不一致导致性能下降25%,你敢信?
故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...
- jvm的代码缓存耗尽导致性能下降
在没遇到这个问题之前,我对JVM的解释模式与编译模式的代码性能相差有多大,是没有感觉的,只是觉得编译模式会比解释模式性能好那么一点点吧. 但是经历过这次以后,让我对JVM的即时编译产生了兴趣.先来看看 ...
- SQL Server ->> 性能调优案例之 -- 包含递归查询的视图导致整个查询语句性能下降
有个语句最近性能下降很厉害,原本1秒就可以查询完毕的事情现在居然需要3-4分钟. 首先我的做法是先快速找出导致整个语句下降的元凶.在这个例子里面查询语句有3个JOIN字句,我通过删除某一个JOIN节点 ...
- Oracle迁移到MySQL性能下降的注意点(转)
背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障.在我的记忆里面淘宝最初从Oracle ...
- MySQL 5.7 分区表性能下降的案例分析
转载自:https://mp.weixin.qq.com/s/K3RpSBAIWFwGCIWyfF0QPA 前言:希望通过本文,使MySQL5.7.18的使用者知晓分区表使用中存在的陷阱,避免在该版本 ...
- 一个MySQL 5.7 分区表性能下降的案例分析
告知MySQL5.7.18的使用者分区表使用中存在的陷阱,避免在该版本上继续踩坑.同时通过对源码的讲解,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的 ...
- (转)一个MySQL 5.7 分区表性能下降的案例分析
一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...
- 使用Django.core.cache操作Memcached导致性能不稳定的分析过程
使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...
- 4.性能下降原因和常见的Join查询
性能下降 SQL慢,执行时间长,等待时间长 1.查询语句写的烂 2.索引失效 单值索引失效 和 复合索引失效 3.关联查询太多join(设计缺陷或不得已的需求) 4.服务器调优及各个参数设置(缓冲.线 ...
随机推荐
- 『动善时』JMeter基础 — 43、JMeter对数据库的查询操作
目录 1.使用"用户自定义变量"实现参数化 2. 在SQL Query中使用占位符传递参数 (1)传递的参数值是常量 (2)传递的参数值是变量 3.Variables names参 ...
- Kubernetes 实战——发现应用(Service)
一.简介 服务:一种为一组功能相同的 Pod 提供单一不变的接入点的资源.服务 IP 和端口不会改变 对服务的连接会被路由到提供该服务的任意一个 Pod 上(负载均衡) 服务通过标签选择器判断哪些 P ...
- noConflict冲突处理机制
最近接手了一个古早项目,用的backbone,于是正好学习一下早期MVC框架的源码. 这篇主要写冲突处理机制,源码其实就一个函数,代码也很短.原理也很好理解,总结起来就是:每执行一次noConflic ...
- Spring Boot下的一种导出CSV文件的代码框架
1.前言 CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...
- 环境安装——JDK安装
@ 目录 开发环境-JDK安装 1. 下载地址 2. 安装JDK 3. 配置系统环境 开发环境-JDK安装 无论在我们开始学习Java或者入职第一天安装环境,这个你都是必备滴!下面是下载和安装JDK的 ...
- ClickHouse源码笔记6:探究列式存储系统的排序
分析完成了聚合以及向量化过滤,向量化的函数计算之后.本篇,笔者将分析数据库的一个重要算子:排序.让我们从源码的角度来剖析ClickHouse作为列式存储系统是如何实现排序的. 本系列文章的源码分析基于 ...
- C++调用Libreoffice接口
由于部分原因,只提供cpp文件,其中代码还需要优化 其中主要涉及了Excel的创建 Sheet页的增加.删除.重命名 表格的合并 表格背景.边框部分属性的设置 表格内字体部分属性设置 表格内容的读取和 ...
- Vue 前端权限控制的优化改进版
1.前言 之前<Vue前端访问控制方案 >一文中提出,使用class="permissions"结合元素id来标识权限控制相关的dom元素,并通过公共方法check ...
- Jenkins CI&CD 自动化发布项目实战(下篇)
Jenkins CI&CD 自动化发布项目实战(下篇) 作者 刘畅 时间 2020-12-04 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...
- 49、django工程(cookie+session)
49.1.介绍: 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要"保持状态",因此cookie就是在这样一个场景下诞生. cooki ...