CRUD麻痹了吗?被xxx吐槽零碎慢吗?你真的理解你的代码吗?明天聊聊一些对于java性能的细节。
局部内容来自这个网站:http://java-performance.com,英文比拟好的小伙伴能够间接看原文,我明天的内容是本人总结和局部翻译的结合物。
正篇
一、java中正则表达式相干优化
- 应用Matcher和Pattern进行预编译,替换String.matches, split, replaceAll, replaceFirst等办法,防止不必要的pattern编译
二、java.util.LinkedList性能
- 思考应用ArrayDeque用于基于队列的算法替换LinkedList,性能优于LinkedList
- 应用ListIterator(forEach)遍历LinkedList【链表个性】
- 防止任何承受或返回列表中元素索引的LinkedList办法【相似获取index的操作】,性能很差,遍历列表实现
- 应用pollFirst/pollLast替换LinkedList.remove/removeFirst/removeLast办法
三、java.util.Date, java.util.Calendar and java.text.SimpleDateFormat performance日期的存储,解析和转换
- 除非您必须应用java.util.Date,否则不要应用它。改用一般的long。
- java.util.Calendar可用于各种日期计算,但要防止存储大量此类对象或宽泛创立它们——它们耗费了大量内存,创立老本昂扬。
- java.text.SimpleDateFormat实用于个别案例日期工夫解析,但如果您必须以雷同的格局解析大量日期(特地是没有工夫的日期),最好防止它。改为手动实现解析器。
四、应用Joda Time类库进行工夫解决,在某些方面性能更好
- 官网:https://www.joda.org/joda-time/
五、java.io.ByteArrayOutputStream,不应该在性能要害代码中应用ByteArrayOutputStream
- 对于性能要害型代码,请尝试应用ByteBuffer而不是ByteArrayOutputStream。如果您依然想应用ByteArrayOutputStream-请勾销其同步。
- 在大多数状况下,防止应用ByteArrayOutputStream.toByteArray办法——它创立一个外部字节数组的正本。如果您的应用程序应用几千兆字节内存,收集这些正本的垃圾可能须要相当长的工夫。
六、java.io.BufferedInputStream, java.util.zip.GZIPInputStream, java.nio.channels.FileChannel:这两个流中的一些小性能陷阱
- BufferedInputStream和GZIPInputStream都有外部缓冲区。前者的默认大小为8192字节,后者的默认大小为512字节。一般来说,值得将任何尺寸减少到至多65536。(缩小BufferedInputStream,GZIPInputStream主动扩容的性能损耗)
七、各种通用压缩算法的性能——其中一些速度惊人(LZ4)
- 如果您认为数据压缩速度十分迟缓,请查看LZ4(疾速)实现,该实现可能以约320 Mb/秒的速度压缩文本文件——对于大多数应用程序来说,这种速度的压缩不应该很显著。如果可能,将LZ4压缩缓冲区大小减少到32M限度是有意义的(请记住,您须要一个相似大小的缓冲区进行解压缩)。您还能够尝试将2个具备32M缓冲区大小的LZ4BlockOutputStream-s链起来,以充分利用LZ4。
- 如果您被限度应用第三方库或想要更好的压缩,请查看JDK deflate(lvl=1)【实现类:java.util.zip.DeflaterOutputStream / InflaterInputStream】编解码器——它可能以~75 Mb/秒的速度压缩同一文件。
八、ava.util.Map、java.util.Set及其大多数实现的优化(尽量避免应用contains)
- 对于汇合,contains+add/remove调用对应替换为单个add/remove调用
- 对于Map,防止contains+get应用,替换为get,而后是get后果的null查看。contains+remove对应替换为单个remove调用并查看其后果。【另:ConcurrentHashMap的containsKey办法自身就是get办法实现的】
九、单线程和多线程环境中的java.util.Random和java.util.concurrent.ThreadLocalRandom概述
- 在任何状况下,都不要在多个线程之间共享java.util.Random的实例,而是将其包装在ThreadLocal中
十、应用Apache Commons StringUtils.replace而不是String.replace
- 如果代码中存在大量的替换操作,思考应用StringUtils。StringUtils远远胜过了 Java 8 的 String.replace 办法。
// replace this
test.replace(“test”, “simple test”);
// with this
StringUtils.replace(test, “test”, “simple test”);
十一、应用double/long替换BigDecimal
- 尽可能应用较小的货币单位,比方(角,分),应用double或long保留
- 四舍五入截取小数位长度
- 防止double转换成BigDecimal,如果要转换应用String转换BigDecimal
发表回复