编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)...

2023-11-04

第10章:性能和效率

建议132:提升Java性能的基本方法

建议133:若非必要,不要克隆对象

建议134:推荐使用“望闻问切”的方式诊断性能

建议135:必须定义性能衡量标准

建议136:枪打出头鸟--解决首要系统性能问题

建议137:调整JVM参数以提高性能

建议138:性能是个大“咕咚”

第11章:开源世界

建议139:大胆采用开源工具

建议140:推荐使用Guava扩展工具包

建议141:Apache工具包

建议142:推荐使用Joda日期扩展包

建议143:可以选择多种Collection扩展

第十二章:思想为源

建议144:提倡良好的代码风格

建议145:不要完全依靠单元测试来发现问题

建议146:让注释正确、清晰、简洁

建议147:让接口的职责保持单一

建议148:增强类的可替换性

建议149:依赖抽象而不是实现

建议150:抛弃七条不良的编码习惯

建议151:以技术员自律而不是工人

第10章:性能和效率

建议132:提升Java性能的基本方法

JAVA性能优化:35个小细节让你提升java代码的运行效率

建议133:若非必要,不要克隆对象

JVM对new进行了大量的性能优化,而clone方式只是一个冷僻的生成对象方式,并不是主流,它主要用于构造函数比较复杂,对象属性比较多,通过new关键字创建一个对象比较耗时间的时候。

建议134:推荐使用“望闻问切”的方式诊断性能

1、望

性能问题从表象上可以分为两类:

① 较难重现的偶发性问题

② 可重现的性能问题

2、闻

在性能优化上的“闻”则是关注项目被动产生的信息,其中包括:项目组的技术能力(主要取决于技术经理的技术能力)、文化氛围、群体的习惯和习性,以及他们专注和擅长的领域等。
@如果项目组的技术能力很强,有资深的数据库专家,有顶尖的架构师,也有首席程序员,那性能问题产生的根源就应该定位在无意识的代码缺陷上。
@如果项目组的文化氛围很糟糕,组员不交流,没有固定的代码规范,缺乏整体的架构等,那性能问题的根源就可能存在于某个配置上,或者相互的接口调用上。
@如果项目组已经习惯了某一个框架,而且也习惯了框架的种种约束,那性能的根源就可能是有人越过了框架的协约。

3、问

与技术人员和业务人员一起探讨问题,了解性能问题的历史状况。

4、切

看设计,看代码,看日志,看系统环境,然后是思考分析,最后给出结论。

建议135:必须定义性能衡量标准

出现性能问题不可怕,可怕的是没有目标。

1、核心业务的响应时间

2、重要业务的响应时间

性能衡量标准必须在一定的环境下,比如网络、操作系统、硬件设备等确定的情况下才会有意义,并且还需要限定并发数、资源数(如10万数据和1000万的数据响应时间肯定不同)等。

建议136:枪打出头鸟--解决首要系统性能问题

解决性能问题时,不要把所有的问题都摆在眼前,这只会“扰乱”你的思维,集中精力,找到那个“出头鸟”,解决它,在大部分情况下,一批性能问题都会迎刃而解,而且我们的用户关注最多的可能就是系统20%的功能,可能我们解决了这一部分,已经达到了用户的预期目标,也就标志着我们的优化工作可以结束了。

建议137:调整JVM参数以提高性能

1、调整堆内存大小

2、调整堆内存中各分区的比例

3、变更GC的垃圾回收策略

4、更换JVM

da9ed2381bcdb5e3986cf442ec9cae0a87f.jpg

注意点:
metaSpace在jdk1.7之前被称为Permanent Space
而且严格意义上讲metaSpace不属于堆空间
见下图:

0306ec0dddd86673944bc333488cf0ee263.jpg

关于部分调优项的介绍

b9afd69c1be56897a0702fd4a0e87264088.jpg

建议138:性能是个大“咕咚”

1、没有慢的系统,只有不满足业务的系统
2、没有慢的系统,只有架构不良的系统
3、没有慢的系统,只有懒惰的技术人员
4、没有慢的系统,只有不愿意投入的系统

第11章:开源世界

建议139:大胆采用开源工具

在选择开源工具和框架时要遵循一定的原则:

1、普适性原则

确保大部分项目成员对工具都比较熟悉

2、唯一性原则

相同的工具只选择一个或一种,不要让多种相同或相似职能的工具共存。
例如集合工具可以在Apache Commons的collections包和Google Guava的Collections工具包中二选其一。

3、用比较有名的开源工具

4、精而专原则

比如虽然Spring框架提供了Utils工具包,但在一般情况下不要使用它,因为它不专,Utils工具包只是Spring框架中的一个附加功能而已,要用就用Apache Commons的BeanUtils、Lang等工具包。

5、高热度原则

一个开源项目的热度越高,更新得就越频繁,使用的人群就越广,Bug的曝光率就越快,修复效率也就越高。

建议140:推荐使用Guava扩展工具包

建议141:Apache工具包

建议142:推荐使用Joda日期扩展包

1、本地格式的日期时间

2、日期计算

3、时区时间

4、可以与JDK的日期库方便地进行转换

建议143:可以选择多种Collection扩展

三个比较有个性的Collections扩展工具包:

1、fastutil

主要提供了两种功能:一种是限定键值类型(Type Specific)的Map、List、Set等,另一种是大容量的集合。

2、Trove

提供了一个快速、高效、低内存消耗的Collections集合,并且还提供了过滤和拦截的功能,同时还提供了基本类型的集合。

Trove的最大优势在于高性能上,在进行一般的增加、修改、删除操作时,Trove的响应时间比JDK的集合少了一个数量级,比fastutil也会高很多,因此在高性能项目中药考虑使用Trove。

3、lambdaj

lambdaj是一个纯净的集合操作工具,他不会提供任何的集合扩展,只会提供集合的操作,比如查询、过滤、统一初始化等,特别是它的查询操作,会提供求和、求平均值的方法:

List<Integer>ints=new ArrayList<Integer>();
//计算平均值
Lambda.avg(ints);
//统计每个元素出现的次数,返回的是一个Map
Lambda.count(ints);
//按照年龄排序
List<Person>persons=new ArrayList<Person>();
Lambda.sort(persons, Lambda.on(Person.class).getAge()));
//串联所有元素的指定属性,输出为:张三,李四,王五
Lambda.joinFrom(persons).getName();
//过滤出年龄大于20岁的所用元素,输出为一个子列表
Lambda.select(persons, new BaseMatcher<Person>(){
@Override
public boolean matches(Object_person){
Person p=(Person)_person;
return p.getAge()>20;
}
public void describeTo(Description desc){
}
});
//查找出最大年龄
Lambda.maxFrom(persons).getAge();
//抽取出所有姓名形成一个数组
Lambda.extract(persons, Lambda.on(Person.class).getName()));

第十二章:思想为源

建议144:提倡良好的代码风格

1、整洁

2、统一

3、流行

4、便捷

建议145:不要完全依靠单元测试来发现问题

1、单元测试不可能测试所有的场景(路径)
单元测试必须测试的三种数据场景是:正常场景、边界场景、异常场景。如果要进行完整的测试就必须建立三个不同的测试场景:正常数据场景,用来测试代码的主逻辑;边界数据场景,用来测试代码(或数据)在边界的情况下逻辑是否正确;异常数据场景,用来测试出现异常非故障时能否按照预期运行。
通常在项目中,单元测试覆盖率很难达到60%,因为不能100%覆盖,这就导致了代码测试的不完整性,隐藏的缺陷也就必然存在了。
2、代码整合错误是不可避免的

3、部分代码无法测试

4、单元测试验证的是编码人员的假设

建议146:让注释正确、清晰、简洁

提倡好的注释:
1、法律版权信息
2、解释意图的注释
说明为什么要这样做,而不是怎么做的,比如解决了哪个Bug,方法过时的原因是什么。
3、警示性注释
4、TODO注释

建议147:让接口的职责保持单一

单一职责有以下三个优点:
1、类的复杂性降低
2、可读性和可维护性提高
3、降低变更风险

建议148:增强类的可替换性

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。

建议149:依赖抽象而不是实现

依赖倒置原则(Dependence Inversion Principle,简称DIP):
高层模块不应该依赖低层模块,两者都应该依赖其抽象。
抽象不应该依赖细节。
细节应该依赖抽象。

要做到遵循此原则要做到以下几点:
(1)尽量抽象
接口和抽象类都是属于抽象的,有了抽象才可能依赖倒置。
(2)表面类型必须是抽象的
比如定义集合,尽量使用:
List<String>list=new ArrayList<String>();
(3)任何类都不应该从具体类派生
开发阶段要做到这一点,但不是绝对的,尤其是在维护时。
(4)尽量不要覆写基类的方法
(5)抽象不关注细节

建议150:抛弃七条不良的编码习惯

1、自由格式的代码

2、不使用抽象的代码

3、彰显个性的代码

4、死代码

5、冗余的代码

6、拒绝变化的代码

7、自以为是的代码

建议151:以技术员自律而不是工人

1、熟悉工具

2、使用IDE

3、坚持编码

4、编码前思考

5、坚持重构

6、多写文档

7、保持程序版本的简单性

8、做好备份

9、做单元测试

10、不要重复发明轮子

11、不要拷贝

12、让代码充满灵性

13、测试自动化

14、做压力测试

15、“剽窃”不可耻

多看开源代码

16、坚持向敏捷学习

17、分享

18、刨根问底

19、横向扩展

Java要运行在JVM、操作系统上,同时还要与硬件、网络、存储交互,另外要遵循诸如FTP、SMTP、HTTP等协议,还要实现Web Service、RMI、XML-RPC等接口,所以我们必须熟悉相关的知识—扩展知识面,这些都是必须去学习的。

 

编写高质量代码:改善Java程序的151个建议@目录

转载于:https://my.oschina.net/u/4006148/blog/3084426

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)... 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • CPU负载怎么理解?是不是CPU利用率?

    http www hackbase com tech 2011 08 16 64970 html 昨天查看Nagios警报信息 发现其中一台服务器CPU负载过重 机器为CentOS系统 信息如下 2011 2 15 星期二 17 50WAR
  • 这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [转自华尔街的强帖]怎样才能嫁给有钱人

    一个年轻漂亮的美国女孩在美国一家大型网上论坛金融版上发表了这样一个问题帖 我怎样才能嫁给有钱人 我下面要说的都是心里话 本人 25 岁 非常漂亮 谈吐文雅 有品位 想嫁给年薪 50 万美元的人 你也许会说我贪心 但在纽约年薪 100 万才算
  • YOLOV7详细解读(三)技术要点归纳

    YOLOV7技术要点归纳 技术要点归纳 YOLOV7技术要点归纳 前言 一 YOLOV7是什么 二 论文贡献 三 相关工作 四 网络架构 五 重参数化 六 模型缩放 七 E ELAN 结构图 分组卷积 八 损失函数 九 动态标签分配策略 步
  • Kubernetes Deployment

    Deployment是Kubernetes1 2引入的新概念 引入的目的是为了更好的解决Pod的编排问题 为此Deployment内部使用了Replica Set来实现目的 Deployment 相对于RC的一个最大升级是我们可以随时知道当
  • 使用Rider断点调试lua代码

    记录一下 新建调试配置 在 Rider 工具栏的 Debug Config 中点击 Editor Configigurations 然后点击 号 新建一个 Emmy Debugger NEW 输入调试器名字为 Tcp Debugger co
  • Linux中cmake指定特定版本gcc

    最近因为服务器上有多个gcc 编译llvm的时候需要使用5 1以上的 但是由于默认目录 usr bin下的gcc是4 8 5 在另外的目录下有一个7 3 1的 cmake默认使用老版本的gcc 导致cmake失败 报错 输入which gc
  • websocked基础

    websocked基础 http与websocked区别 http websocked websocked特点 如何使用websocked 补充blob对象或Arraybuffer对象 http与websocked区别 http 只能由客户
  • cannot find reference ‘keras’ in ‘__init__.py‘

    文章目录 起因 原因 解决办法 参考来源链接 起因 在网上找了开源代码 之前看的都是jupyter notebook编写的 今天用pycharm调试一个开源程序 发现总是不能调试 检查了好几遍编译环境都没问题 运行正常 就是不能调试 报错是
  • 早期计算机语言称为,程序设计语言是软件的基础和组成部分,也称为计算机语言...

    原标题 程序设计语言是软件的基础和组成部分 也称为计算机语言 程序是对计算任务的处理对象和处理规则的描述 必须装入计算机内部才能工作 没有操作系统 系统无用 程序设计语言是软件的基础和组成部分 也称为计算机语言 定义计算机程序的语法规则 由
  • torch.nn.Linear()函数讲解

    函数讲解 in features指的是输入的二维张量的大小 即输入的 batch size size 中的size out features指的是输出的二维张量的大小 即输出的二维张量的形状为 batch size output size
  • 【Matlab】智能优化算法_灰狼优化算法GWO

    Matlab 智能优化算法 灰狼优化算法GWO 1 背景介绍 2 基本思想 2 1 等级制度 2 2 狩猎方式 3 公式推导 3 1 社会等级制度 3 2 包围猎物 3 3 包围猎物 3 4 攻击猎物 3 5 搜索猎物 4 算法流程图 5
  • 史上最详细springboot vue UEditor整合(包括遇到的各种坑)

    Vue中引入UEditor看这篇教程https blog csdn net kshon article details 102667318 接下来说说springboot中配置UEditor遇到的各种坑 1 将UEditor中目录下的con
  • IM即时通讯-推荐框架

    CIM https gitee com farsunset cim CIM是一套基于mina或netty框架下的推送系统 或许有一些企业有着自己一套即时通讯系统的需求那么CIM为您提供了一个解决方案 目前CIM支持websocket and
  • java map取第一个元素_java常用对象Map集合中关于取出元素的说明

    之前在上一篇 java常用对象API中集合框架之Map的用法 文章中简单的例举了一些Map集合中的一些简单方法和一些常用的子类 那么本章将对例举的方法和子类进行一一的详细说明和举例 这样也是为了让更多的朋友们学习java能够得到另一种启发而
  • 将手机、平板变成电脑第二屏

    将手机 平板变成电脑第二屏 过年回家了 带着大包小包 显示器总不能再带在身上吧 常年双屏使用者 当没有了双屏 感觉很难受 于是找到了开源项目deskreen Deskreen 是一款桌面应用程序 可以通过 WiFi 局域网下 将任何带有浏览
  • 华为OD机试 Python 【恢复数字序列】

    描述 给你一个由正整数拼接而成的字符串 但中间有些字符位置被打乱了 比如原来有 89101112 它可能被打乱为 90811211 这时整数10就变成了0和1两部分 请你找出原始字符串中的最小正整数是什么 输入 一行 包括被打乱的字符串和原
  • RabbitMQ 消息丢失的场景,如何保证消息不丢失?

    一 RabbitMQ消息丢失的三种情况 第一种 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候 可能数据就在半路给搞丢了 因为网络问题啥的 都有可能 第二种 RabbitMQ 弄丢了数据 MQ还没有持久化自己挂了 第三种 消
  • 【C#】.Net 腾讯云一句话识别 【实例】

    腾讯云一句话识别实例 using System using System Threading Tasks using TencentCloud Common using TencentCloud Common Profile using T
  • 编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)...

    第10章 性能和效率 建议132 提升Java性能的基本方法 建议133 若非必要 不要克隆对象 建议134 推荐使用 望闻问切 的方式诊断性能 建议135 必须定义性能衡量标准 建议136 枪打出头鸟 解决首要系统性能问题 建议137 调