一:java程序优化
1:字符拼接:(StringBuffer)
对比: 不要+号拼接字符串,用StringBuffer的append来拼接、性能很好
方式一
程序跑起来,大约花费 27687 毫秒。
方式二
使用 StringBuilder 进行拼接字符串。
6:cpu的优化点
cpu有:空间局部性和时间局部性两种特性:
一:空间局部性,当cpu获取数据时,如果这个数据是连续数据,那么cpu会把当前数据和该数据的连续数据读取到cpu的三级缓存中。 那么当下次读取的数据在连续数据中时,就直接在cpu三级缓存中读取就行。减少了读取内存的次数。(在cpu这一层,从内存中读取数据比从cpu的三级缓存中读取数据慢的多)
二:时间局部性
程序跑起来,大约花费 24 毫秒。
2:数据分割:(StringTokenizer)
string的split()和字符串分割工具类StringTokenizer
方式一:
经常用 String 提供的 split() 方法来满足业务需求。
花费大约 3000 多毫秒。
方式二:
采用字符串分割的工具类 StringTokenizer。
采用 StringTokenizer 完成 split() 同样的数据分割,花费大约 500 毫秒。
3:数组赋值 (System.arraycopy() )
方式一:
方式二:
System.arraycopy() 来完成数组复制
方式一和方式二差距不大,但是数据量大的情况下用System.arraycopy() 好一点
4:关注循环体
方式一:
让程序与少做重复的计算,关注循环体内的代码
花费时间:30毫秒
方式二:
花费时间:2毫秒
结论:从循环体中提取重复的代码 到循环体外,可以有效提升系统性能
5:List
List是一个接口,它继承于Collection的接口,它代表着有有序队列,当我们讨论List的时候,一般和Set做比较。
java类中集合类中的关系图,从中了解集合关系
一:ArrayList、 LinkedList 和 Vector之间的区别:
ArrayList:底层是数组,可以认为ArrayList是一个可以改变大小的数组,
LinkedList:底层是通过双向链表实现的,LinkedList和ArrayList之前的区别主要是数组和链表的区别。
在内存中:
数组:内存连续,可以通过地址增量获取。
链表:内存多数,不连续。需要比那里。
二:ArrayList和LinkedList对比:ArrayList查询速度比较快
这个和cpu的空间局部性有关:
一:数组因为数据在内存中连续。所以可以把要查询的数据,并且该数据--连续的数据缓存到cpu的缓存中。
二:链表在内存中数据不连续,只能去内存中一个个读取
各级别的存储器速度差异非常大,CPU寄存器速度是内存速度的100倍! 这就是为什么CPU产商发明了CPU缓存。 而这个CPU缓存,就是数组和链表的区别的关键所在。
CPU缓存会把一片连续的内存空间读入, 因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面, 平均读取每个元素的时间只要3个CPU时钟周期。 而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)
三:ArrayList和LinkedList对比:LinkedList添加删除比较快
数组:添加或者删除数据,需要移动后面的所有数据
链表:只要增加一个节点,通过指针操作,不需要移动后面的元素。
四:ArrayList、 Vector之间的区别
ArrayList和Vector都是通过数组实现的,但是Vector线程安全的,和ArrayList相比,Vector的很多方法都是通过同步(synchronized)处理来保证线程安全。所以一般情况不涉及线程就不用Vector