基于: macOs:10.13/AS:3.3.2/Android build-tools:28.0.0/jdk: 1.8
1. 缘由
这两天在看 smali
, 偶然看到 log
语句中的 String
拼接被优化为了 StringBuilder
, 代码如下;
// MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private void methodBoolean(boolean showLog) {
Log.d(TAG, "methodBoolean: " + showLog);
}
}
复制代码
# 对应的 smali 代码
.method private methodBoolean(Z)V
.locals 3
.param p1, "showLog" # Z
.line 51
const-string v0, "MainActivity" # 定义 TAG 变量值
new-instance v1, Ljava/lang/StringBuilder; # 创建了一个 StringBuilder
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
# 定义 Log msg参数中第一部分字符串字面量值
const-string v2, "methodBoolean: "
# 拼接并输出 String 存入 v1 寄存器中
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
# 调用 Log 方法打印日志
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 52
return-void
.end method
复制代码
想起以前根深蒂固的 "大量字符串拼接时 StringBuilder
比 String
性能更好" 的说法, 顿时好奇是否真是那样, 是否所有场景都那样, 所以想探究下, 简单起见, 源码用 Java
而非 Kotlin
编写;
2. 测试
既然底层会优化为 StringBuilder
那拼接还会有效率差距吗? 测试下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/**
* String循环拼接测试
*
* @param loop 循环次数
* @param base 拼接字符串
* @return 耗时, 单位: ms
*/
private long methodForStr(int loop, String base) {
long startTs = System.currentTimeMillis();
String result = "";