这里尝试做的是通过在循环外使用 StringBuilder 来提高速度性能,并在每个循环中清除 StringBuilder 以供重用,但似乎这种方法并不总是有效,因为我没有看到速度性能的改进.*
public class Loader implements Runnable {
private int i;
public Loader(int i) {
this.i = i;
}
@Override
public void run() {
long start = System.currentTimeMillis();
try {
PrintWriter writer = new PrintWriter("res/NUMBERS " + i + ".txt");
char letters[] = {'У', 'К', 'Е', 'Н', 'Х', 'В', 'А', 'Р', 'О', 'С', 'М', 'Т'};
StringBuilder stringBuilder = new StringBuilder();
for (int regionCode = 1; regionCode <= 199; regionCode++) {
stringBuilder.setLength(0);
for (int number = 1; number < 1000; number++) {
for (char firstLetter : letters) {
for (char secondLetter : letters) {
for (char thirdLetter : letters) {
stringBuilder.append(firstLetter)
.append(padNumber(number, 3))
.append(secondLetter)
.append(thirdLetter)
.append(padNumber(regionCode, 2))
.append("\n");
}
}
}
}
writer.write(stringBuilder.toString());
}
writer.flush();
writer.close();
System.out.println(System.currentTimeMillis() - start);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String padNumber(int number, int numberLength) {
String numberStr = Integer.toString(number);
int padSize = numberLength - numberStr.length();
for(int i=0;i<padSize;i++) {
numberStr = '0' + numberStr;
}
return numberStr;
}
public static void main(String[] args) {
for (int i = 0; i < 1; i++) {
new Thread(new Loader(i)).start();
}
}
}
当我在循环内使用 StringBuilder 时,该过程需要 30 秒才能完成,但使用上面所示的方法需要 50 秒才能完成该过程,这不是我所期望的。提前致谢。
setLength
比 StringBuilder 的构造函数更耗时。当然,在开始纳秒级测量之前您不会看到差异,但是通过重用 StringBuilder 的同一实例来节省时间的想法是错误的。
如果您的重点只是加快流程,那么这样的东西将是并发的一个很好的选择。