因此,我一直相信使用“+”运算符将字符串附加到一行上与使用 StringBuilder 一样有效(而且在视觉上肯定更好)。今天虽然我在附加变量和字符串的记录器上遇到了一些速度问题,但它使用了“+”运算符。所以我做了一个快速的测试用例,令我惊讶的是发现使用 StringBuilder 更快!
基础是我使用 4 种不同的方法(如下所示)对每个附加数量使用 20 次运行的平均值。
结果,时间(以毫秒为单位)
# 追加 10^1 10^2 10^3 10^4 10^5 10^6 10^7 StringBuilder(容量) 0.65 1.25 2 11.7 117.65 1213.25 11570 StringBuilder() 0.7 1.2 2.4 12.15 122 1253.7 12274.6 “+”运算符 0.75 0.95 2.35 12.35 127.2 1276.5 12483.4 字符串格式 4.25 13.1 13.25 71.45 730.6 7217.15 -
与最快算法的差异百分比图。
我检查了字节码,每种字符串比较方法都不同。
这是我用于方法的内容,您可以在此处查看整个测试类。
public static String stringSpeed1(float a, float b, float c, float x, float y, float z){
StringBuilder sb = new StringBuilder(72).append("[").append(a).append(",").append(b).append(",").append(c).append("][").
append(x).append(",").append(y).append(",").append(z).append("]");
return sb.toString();
}
public static String stringSpeed2(float a, float b, float c, float x, float y, float z){
StringBuilder sb = new StringBuilder().append("[").append(a).append(",").append(b).append(",").append(c).append("][").
append(x).append(",").append(y).append(",").append(z).append("]");
return sb.toString();
}
public static String stringSpeed3(float a, float b, float c, float x, float y, float z){
return "["+a+","+b+","+c+"]["+x+","+y+","+z+"]";
}
public static String stringSpeed4(float a, float b, float c, float x, float y, float z){
return String.format("[%f,%f,%f][%f,%f,%f]", a,b,c,x,y,z);
}
我现在尝试过使用浮点数、整数和字符串。所有这些都或多或少地显示出相同的时差。
问题
- “+”运算符显然不是变成同一个字节码,时间与最优相差很大。那么给了什么?
- 100 到 10000 个附加数之间的算法行为对我来说很奇怪,所以有人解释一下吗?