读书笔记

来源:互联网 发布:电子处方软件app 编辑:程序博客网 时间:2024/05/16 14:57

第一章 Java 性能优化【2017/8/20】

一、调优概述

1.程序的性能一般通过以下几个方面来表现:

(1) 执行速度
(2) 内存分配
(3) 启动时间
(4) 负载承受能力

2.性能的参考指标:

(1) 执行时间
(2) CPU时间
(3) 内存分配
(4) 磁盘吞吐量
(5) 网络吞吐量
(6) 相应时间

根据木桶原理,系统的最终性能取决于系统中性能表现最差的组件,因此为了提升系统整体性能,必须对系统中表现最差的组件进行优化。

3.最有可能成为系统瓶颈的计算资源如下:

(1) 磁盘I/O
(2) 网络操作
(3) CPU
(4) 异常
(5) 数据库
(6) 锁竞争
(7) 内存

4.性能调优的层次:

(1)设计调优:一个良好的系统设计可以规避很多潜在的性能问题。因此,尽可能多花时间在洗头膏设计上,是创建高性能程序的关键。
(2)代码调优:虽然和设计优化相比,代码优化成为在微观层面的优化,到时它却是对系统性能产生最直接影响的优化方法。
(3)JVM调优
(4)数据库调优:a 在应用层对sql语句进行调优 b对数据库进行优化 c对数据库软件进行优化
(5)操作系统调优

总结:性能调优必须有明确的目标,不要为了调优而调优,如果当前程序并没有明显的性能问题,盲目的调整,其风险可能远大于收益。

第三章java程序优化

一、字符串优化处理

String对象并不是java的基础数据类型,有三个基本特点:不变性,针对常量池的优化,类的final定义。

不变性:不变性是指String对象一旦生成,则不能再对它进行改变。

针对常量池的优化:是指当两个String对象拥有相同的值的时候,它们只引用常量池中的同一个拷贝。

例如:

String str1=“abc”;String str2=“abc”;String str3=new String(“abc”);

以上的代码显示str1和str2引用了相同的地址,但是str3却重新开辟了一块内存空间,但是三者在常量池中的位置是完全相同的。

这里写图片描述

类的final定义:作为final类的String对象在系统中不可能有任何子类。

3.1 SubString函数的内存泄漏问题:

因为返回的字符串中国包含原字符串,如果原字符串很大,截取的字符串长度却很短,那么截取的子字符串中包含了原生字符串的所有内容,并且占据了相应的内存空间,这种方法提高了运算速度但是却浪费了空间。

例子:

Class HugeStr(){    Private  String str=new String (new char[10000]);Public String getSubString(int begin ,int end){    Return str.substring(begin,end);//截取字符串 因为原字符串很长 所以很容易发生溢出}}

优化后

Class HugeStr(){    Private  String str=new String (new char[10000]);Public String getSubString(int begin ,int end){    Return new String(str.substring(begin,end));//截取字符串 并重新生成新字符串 没有溢出}}

3.2 字符串分割和查找

String.split() 方法使用简单 ,功能强大,但是,在性能敏感的系统中频繁的使用这个方法是不可取的。应该使用StringTokenizer类来分割字符串。

StringTokenizer类是JDK中提供的专门 用来处理字符串分割子串的工具类。

Public StringTokenizer (String str ,String delim);

其中str是要分割处理的字符串,delim是分割符号。

使用方法 StringTokenizer str =new StringTokenizer(orgStr,”,”);

3.3 高效率的charAt()方法

CharAt函数比startWith()[或者endsWith()]函数更高效。

3.4 StringBuffer 和StringBuilder

JDK专门提供了用于创建和修改字符串的工具。就是StringBuffer 和StringBuilder类。

(1) 对于静态字符串的连接操作,java在编译时会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的长字符串。

(2) Java在编译时,就会对字符串处理一定的优化,因此,一些看起来会很慢的代码,可能实际并不是太慢。

(3) String的加法操作虽然会被优化,但是并不够聪明,所以类似于“+”和“+=”的运算符应该尽量少用。其次String的concat()方法的效率远远高于“+”和“+=”运算符,但是又远远低于StingBuiler。

(4) StringBuilder和StringBuffer是一对孪生兄弟,是字符串连接操作的最好的选择,他们的区别在于:在无需考虑线程安全的情况下可以使用性能相对较好的StringBuilder 但是如果系统有线程安全要求,就只能选择StringBuffer

(5) 容量参数:StringBuilder和StringBuffer在初始化时候可以设置一个容量参数,默认是16字节,也就是说StringBuilder和StringBuffer在初始化时候指定一个容量参数比不指定要好多。