Java性能优化之影响性能的那些细节
【Java性能优化之影响性能的那些细节】? CRUD麻木了吗?被xxx吐槽系统慢吗?你真的了解你的代码吗?今天聊聊一些关于java性能的细节。
文章图片
部分内容来自这个网站:http://java-performance.com,英文比较好的小伙伴可以直接看原文,我今天的内容是自己总结和部分翻译的结合物。
正篇
一、java中正则表达式相关优化
- 使用Matcher和Pattern进行预编译,替换String.matches, split, replaceAll, replaceFirst等方法,避免不必要的pattern编译
- 考虑使用ArrayDeque用于基于队列的算法替换LinkedList,性能优于LinkedList
- 使用ListIterator(forEach)遍历LinkedList【链表特性】
- 避免任何接受或返回列表中元素索引的LinkedList方法【类似获取index的操作】,性能很差,遍历列表实现
- 使用pollFirst/pollLast替换LinkedList.remove/removeFirst/removeLast方法
- 除非您必须使用java.util.Date,否则不要使用它。改用普通的long。
- java.util.Calendar可用于各种日期计算,但要避免存储大量此类对象或广泛创建它们——它们消耗了大量内存,创建成本高昂。
- java.text.SimpleDateFormat适用于一般案例日期时间解析,但如果您必须以相同的格式解析大量日期(特别是没有时间的日期),最好避免它。改为手动实现解析器。
- 官网:https://www.joda.org/joda-time/
- 对于性能关键型代码,请尝试使用ByteBuffer而不是ByteArrayOutputStream。如果您仍然想使用ByteArrayOutputStream-请取消其同步。
- 在大多数情况下,避免使用ByteArrayOutputStream.toByteArray方法——它创建一个内部字节数组的副本。如果您的应用程序使用几千兆字节内存,收集这些副本的垃圾可能需要相当长的时间。
- BufferedInputStream和GZIPInputStream都有内部缓冲区。前者的默认大小为8192字节,后者的默认大小为512字节。一般来说,值得将任何尺寸增加到至少65536。(减少BufferedInputStream,GZIPInputStream自动扩容的性能损耗)
- 如果您认为数据压缩速度非常缓慢,请检查LZ4(快速)实现,该实现能够以约320 Mb/秒的速度压缩文本文件——对于大多数应用程序来说,这种速度的压缩不应该很明显。如果可能,将LZ4压缩缓冲区大小增加到32M限制是有意义的(请记住,您需要一个类似大小的缓冲区进行解压缩)。您还可以尝试将2个具有32M缓冲区大小的LZ4BlockOutputStream-s链起来,以充分利用LZ4。
- 如果您被限制使用第三方库或想要更好的压缩,请检查JDK deflate(lvl=1)【实现类:java.util.zip.DeflaterOutputStream / InflaterInputStream】编解码器——它能够以~75 Mb/秒的速度压缩同一文件。
- 对于集合,contains+add/remove调用对应替换为单个add/remove调用
- 对于Map,避免contains+get使用,替换为get,然后是get结果的null检查。contains+remove对应替换为单个remove调用并检查其结果。【另:ConcurrentHashMap的containsKey方法本身就是get方法实现的】
- 在任何情况下,都不要在多个线程之间共享java.util.Random的实例,而是将其包装在ThreadLocal中
- 如果代码中存在大量的替换操作,考虑使用StringUtils。StringUtils远远胜过了 Java 8 的 String.replace 方法。
// replace this
test.replace(“test”, “simple test”);
// with this
StringUtils.replace(test, “test”, “simple test”);
- 尽可能使用较小的货币单位,比如(角,分),使用double或long保存
- 四舍五入截取小数位长度
- 避免double转换成BigDecimal,如果要转换使用String转换BigDecimal
文章图片
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- 数据库设计与优化