企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
准备了以下案例: - 字符串格式化、字符串拼接 - 预分配List的大小、预缓存int转String的结果 - 避免不必要的装箱拆箱 - JIT日志观察热点代码、方法内联(高性能)、循环展开 ---- ## 1 推荐使用+号连接字符串 ### 1.1 字符串格式化 在开始之前我们先来看一段代码,大家认为哪一个方法会快一些? > 很多场景下需要格式化字符串,例如日志输出。 ![](https://img.kancloud.cn/f3/18/f318ad6b3a28246dd2c532bb76295a83_904x572.png) ---- 运行以下程序: ![](https://img.kancloud.cn/53/04/53044b193273134f81676f8dd301924b_684x184.png) ---- 使用 `jvisualvm` 进行CPU抽样: ```shell $ jvisualvm ``` ![](https://img.kancloud.cn/47/78/47788ce4f025e746865ee8a2f623c728_1280x475.png) 由监控结果可知 `使用+号` 进行 `字符串格式化` 的耗时明显低于`String.format` 和 `消息模板`。 ---- 下面是使用JMH进行基准测试后的结果(JMH的使用参见附录): ![](https://img.kancloud.cn/f5/51/f551547b378588e19e19256e59a5d165_1144x152.png) 从上面的结果可以看出append方法耗时最短。 > 原因:Formatter每次都会对输入参数预编译成中间格式,再进行输出,效率非常低。 ---- SLF4J采用了如下格式: ```java LOG.info("订单id:{} 用户:{} 状态:{}", id, name, status); ``` 考虑到性能,可以改成以下格式: ```java LOG.info("订单id:" + id + "用户:" + name + "状态:" + status); ```