准备了以下案例:
- 字符串格式化、字符串拼接
- 预分配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);
```