Tôi không nghĩ rằng nên cố gắng tối ưu hóa hiệu suất như vậy. Hôm nay (2019) cả hai trạng thái đang chạy khoảng 11 giây cho 100.000.000 vòng lặp trên Máy tính xách tay I5 của tôi:
String a;
StringBuilder sb = new StringBuilder();
long time = 0;
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
sb3.append("someString2");
sb3.append("someStrin4g");
sb3.append("someStr5ing");
sb3.append("someSt7ring");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
sb.append("someString2");
sb.append("someStrin4g");
sb.append("someStr5ing");
sb.append("someSt7ring");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 11000 msec (khai báo bên trong vòng lặp) và 8236 msec (khai báo bên ngoài vòng lặp)
Ngay cả khi tôi đang chạy các chương trình để công khai địa chỉ với một số tỷ vòng lặp, chênh lệch 2 giây. đối với 100 triệu vòng lặp không tạo ra bất kỳ sự khác biệt nào bởi vì các chương trình đó đang chạy trong nhiều giờ. Cũng xin lưu ý rằng mọi thứ sẽ khác nếu bạn chỉ có một câu lệnh phụ:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3416 msec (vòng lặp bên trong), 3555 msec (vòng lặp bên ngoài) Câu lệnh đầu tiên tạo StringBuilder trong vòng lặp nhanh hơn trong trường hợp đó. Và, nếu bạn thay đổi thứ tự thực hiện thì nhanh hơn nhiều:
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sb.setLength(0);
sb.delete(0, sb.length());
sb.append("someString");
a = sb.toString();
}
System.out.println(System.currentTimeMillis() - time);
System.gc();
time = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
StringBuilder sb3 = new StringBuilder();
sb3.append("someString");
a = sb3.toString();
}
System.out.println(System.currentTimeMillis() - time);
==> 3638 msec (vòng lặp bên ngoài), 2908 msec (vòng lặp bên trong)
Trân trọng, Ulrich