Xem ví dụ dưới đây:
static final int MAX_ITERATIONS = 50000;
static final int CALC_AVG_EVERY = 10000;
public static void main(String[] args) {
printBytecodeVersion();
printJavaVersion();
case1();//str.concat
case2();//+=
case3();//StringBuilder
}
static void case1() {
System.out.println("[str1.concat(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str = str.concat(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case2() {
System.out.println("[str1+=str2]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
String str = "";
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str += UUID.randomUUID() + "---";
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void case3() {
System.out.println("[str1.append(str2)]");
List<Long> savedTimes = new ArrayList();
long startTimeAll = System.currentTimeMillis();
StringBuilder str = new StringBuilder("");
for (int i = 0; i < MAX_ITERATIONS; i++) {
long startTime = System.currentTimeMillis();
str.append(UUID.randomUUID() + "---");
saveTime(savedTimes, startTime);
}
System.out.println("Created string of length:" + str.length() + " in " + (System.currentTimeMillis() - startTimeAll) + " ms");
}
static void saveTime(List<Long> executionTimes, long startTime) {
executionTimes.add(System.currentTimeMillis() - startTime);
if (executionTimes.size() % CALC_AVG_EVERY == 0) {
out.println("average time for " + executionTimes.size() + " concatenations: "
+ NumberFormat.getInstance().format(executionTimes.stream().mapToLong(Long::longValue).average().orElseGet(() -> 0))
+ " ms avg");
executionTimes.clear();
}
}
Đầu ra:
phiên bản java bytecode: 8
java.version: 1.8.0_144
[str1.concat (str2)]
Thời gian trung bình cho 10000 concatenations: 0,096 ms AVG
thời gian trung bình cho 10000 concatenations: 0,185 ms AVG
thời gian trung bình cho 10000 concatenations: 0,327 ms AVG
thời gian trung bình cho 10000 concatenations: 0,501 ms AVG
thời gian trung bình cho 10000 concatenations: 0,656 ms AVG
tạo chuỗi có độ dài: 1.950.000 trong 17.745 ms
[str1 + = str2]
thời gian trung bình cho 10000 concatenations: 0,21 ms AVG
thời gian trung bình cho 10000 concatenations: 0,652 ms AVG
thời gian trung bình cho 10000 concatenations: 1.129 ms avg
thời gian trung bình cho 10000 concatenations: 1.727 ms avg
thời gian trung bình cho 10000 lần ghép: 2.302 ms avg
Chuỗi thời lượng được tạo: 1950000 trong 60279 ms
[str1.append (str2)]
thời gian trung bình cho 10000 lần ghép: 0,002 ms avg
thời gian trung bình cho 10000 lần nối: 0,002 ms
thời gian trung bình cho 10000 lần nối: 0,002 ms avg
thời gian trung bình cho 10000 concatenations: 0,002 ms avg
thời gian trung bình cho 10000 concatenations: 0,002 ms avg
Tạo chuỗi có độ dài: 1950000 trong 100 ms
Khi chiều dài chuỗi tăng, thời gian nối cũng vậy.
Đó là nơi StringBuilder
chắc chắn là cần thiết.
Như bạn thấy, sự kết hợp : UUID.randomUUID()+"---"
, không thực sự ảnh hưởng đến thời gian.
Tái bút: Tôi không nghĩ Khi nào sử dụng StringBuilder trong Java thực sự là một bản sao của điều này.
Câu hỏi này nói về toString()
điều mà hầu hết thời gian không thực hiện nối các chuỗi lớn.
Cập nhật 2019
Kể từ java8
thời gian, mọi thứ đã thay đổi một chút. Có vẻ như bây giờ (java13), thời gian nối của +=
thực tế giống như str.concat()
. Tuy nhiên StringBuilder
thời gian nối vẫn không đổi . (Bài viết gốc ở trên đã được chỉnh sửa một chút để thêm đầu ra dài dòng hơn)
phiên bản java bytecode: 13
java.version: 13.0.1
[str1.concat (str2)]
Thời gian trung bình cho 10000 concatenations: 0,047 ms AVG
thời gian trung bình cho 10000 concatenations: 0,1 ms AVG
thời gian trung bình cho 10000 concatenations: 0,17 ms AVG
thời gian trung bình cho 10000 concatenations: 0,255 ms AVG
thời gian trung bình cho 10000 concatenations: 0,336 ms AVG
tạo chuỗi có độ dài: 1.950.000 trong 9147 ms
[str1 + = str2]
thời gian trung bình cho 10000 concatenations: 0,037 ms AVG
thời gian trung bình cho 10000 concatenations: 0,097 ms AVG
thời gian trung bình cho 10000 concatenations: 0.249 ms avg
thời gian trung bình cho 10000 concatenations: 0.298 ms avg
thời gian trung bình cho 10000 lần ghép: 0,336 ms avg
Chuỗi thời lượng được tạo: 1950000 trong 10191 ms
[str1.append (str2)]
thời gian trung bình cho 10000 lần ghép: 0,001 ms avg
thời gian trung bình cho 10000 lần ghép: 0,001 ms avg
thời gian trung bình cho 10000 lần nối: 0,001 ms avg
thời gian trung bình cho 10000 concatenations: 0,001 ms avg
thời gian trung bình cho 10000 concatenations: 0,001 ms avg
Tạo chuỗi có độ dài: 1950000 trong 43 ms
bytecode:8/java.version:13
Sự kết hợp đáng chú ý cũng có lợi ích hiệu suất tốt so vớibytecode:8/java.version:8