关于java:Java性能优化之影响性能的那些细节

  CRUD麻痹了吗?被xxx吐槽零碎慢吗?你真的理解你的代码吗?明天聊聊一些对于java性能的细节。

局部内容来自这个网站:http://java-performance.com,英文比拟好的小伙伴能够间接看原文,我明天的内容是本人总结和局部翻译的结合物。

正篇

一、java中正则表达式相干优化

  1. 应用Matcher和Pattern进行预编译,替换String.matches, split, replaceAll, replaceFirst等办法,防止不必要的pattern编译

二、java.util.LinkedList性能

  1. 思考应用ArrayDeque用于基于队列的算法替换LinkedList,性能优于LinkedList
  2. 应用ListIterator(forEach)遍历LinkedList【链表个性】
  3. 防止任何承受或返回列表中元素索引的LinkedList办法【相似获取index的操作】,性能很差,遍历列表实现
  4. 应用pollFirst/pollLast替换LinkedList.remove/removeFirst/removeLast办法

三、java.util.Date, java.util.Calendar and java.text.SimpleDateFormat performance日期的存储,解析和转换

  1. 除非您必须应用java.util.Date,否则不要应用它。改用一般的long。
  2. java.util.Calendar可用于各种日期计算,但要防止存储大量此类对象或宽泛创立它们——它们耗费了大量内存,创立老本昂扬。
  3. java.text.SimpleDateFormat实用于个别案例日期工夫解析,但如果您必须以雷同的格局解析大量日期(特地是没有工夫的日期),最好防止它。改为手动实现解析器。

四、应用Joda Time类库进行工夫解决,在某些方面性能更好

  • 官网:https://www.joda.org/joda-time/

五、java.io.ByteArrayOutputStream,不应该在性能要害代码中应用ByteArrayOutputStream

  1. 对于性能要害型代码,请尝试应用ByteBuffer而不是ByteArrayOutputStream。如果您依然想应用ByteArrayOutputStream-请勾销其同步。
  2. 在大多数状况下,防止应用ByteArrayOutputStream.toByteArray办法——它创立一个外部字节数组的正本。如果您的应用程序应用几千兆字节内存,收集这些正本的垃圾可能须要相当长的工夫。

六、java.io.BufferedInputStream, java.util.zip.GZIPInputStream, java.nio.channels.FileChannel:这两个流中的一些小性能陷阱

  1. BufferedInputStream和GZIPInputStream都有外部缓冲区。前者的默认大小为8192字节,后者的默认大小为512字节。一般来说,值得将任何尺寸减少到至多65536。(缩小BufferedInputStream,GZIPInputStream主动扩容的性能损耗)

七、各种通用压缩算法的性能——其中一些速度惊人(LZ4)

  1. 如果您认为数据压缩速度十分迟缓,请查看LZ4(疾速)实现,该实现可能以约320 Mb/秒的速度压缩文本文件——对于大多数应用程序来说,这种速度的压缩不应该很显著。如果可能,将LZ4压缩缓冲区大小减少到32M限度是有意义的(请记住,您须要一个相似大小的缓冲区进行解压缩)。您还能够尝试将2个具备32M缓冲区大小的LZ4BlockOutputStream-s链起来,以充分利用LZ4。
  2. 如果您被限度应用第三方库或想要更好的压缩,请查看JDK deflate(lvl=1)【实现类:java.util.zip.DeflaterOutputStream / InflaterInputStream】编解码器——它可能以~75 Mb/秒的速度压缩同一文件。

八、ava.util.Map、java.util.Set及其大多数实现的优化(尽量避免应用contains)

  1. 对于汇合,contains+add/remove调用对应替换为单个add/remove调用
  2. 对于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

  1. 如果代码中存在大量的替换操作,思考应用StringUtils。StringUtils远远胜过了 Java 8 的 String.replace 办法。
    // replace this
    test.replace(“test”, “simple test”);
    // with this
    StringUtils.replace(test, “test”, “simple test”);

十一、应用double/long替换BigDecimal

  1. 尽可能应用较小的货币单位,比方(角,分),应用double或long保留
  2. 四舍五入截取小数位长度
  3. 防止double转换成BigDecimal,如果要转换应用String转换BigDecimal

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理