Lihat contoh di bawah ini:
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();
}
}
Keluaran:
versi bytecode java: 8
java.version: 1.8.0_144
[str1.concat (str2)]
rata-rata waktu untuk 10.000 concatenations: rata-
rata waktu rata- rata untuk 10.000 concatenations: 0,096 ms:
waktu rata- rata 0,185 ms rata- rata untuk 10000 concatenations: rata-
rata waktu rata- rata avg untuk ms: Rangkaian 10000: rata-
rata rata- rata 0,501 ms
untuk Rangkaian 10000: rata-
rata 0,656 ms,
Diciptakan untai panjang: 1950000 dalam 17745 ms
[str1 + = str2]
rata-rata waktu untuk 10.000 rangkai: rata-
rata waktu rata- rata untuk 0,00 ms : untuk rata- rata 10000: 0,252 rata-
rata pada rata- rata waktu untuk Rangkaian 10000:
Rata-rata waktu 1,129 ms rata- rata untuk Rangkaian 10000: 1,727 ms rata-rata
waktu rata-rata untuk 10.000 gabungan: 2.302 ms rata-rata.
Diciptakan string panjang: 1950000 dalam 60279 ms
[str1.append (str2)]
rata-rata waktu untuk 10.000 gabungan: 0.002 ms rata-
rata waktu rata- rata untuk 10.000 gabungan: 0.002 ms rata-
rata waktu rata- rata untuk 10.000 gabungan: 0,002 ms rata-
rata waktu rata- rata untuk 10000 concatenations: 0,002 ms rata-
rata rata- rata waktu untuk 10000 concatenations: 0,002 ms rata-rata
Diciptakan string panjang: 1950000 dalam 100 ms
Ketika panjang string meningkat, begitu juga waktu penggabungan.
Di situlah StringBuilder
pasti diperlukan.
Seperti yang Anda lihat, gabungan:, UUID.randomUUID()+"---"
tidak terlalu mempengaruhi waktu.
PS: Saya tidak berpikir Kapan menggunakan StringBuilder di Jawa adalah duplikat dari ini.
Pertanyaan ini berbicara tentang toString()
yang sebagian besar kali tidak melakukan rangkaian string besar.
Pembaruan 2019
Sejak java8
saat itu, banyak hal berubah sedikit. Tampaknya sekarang (java13), waktu penyatuan +=
praktis sama dengan str.concat()
. Namun StringBuilder
waktu penggabungan masih konstan . (Posting asli di atas sedikit diedit untuk menambah lebih banyak keluaran verbose)
versi bytecode java: 13
java.version: 13.0.1
[str1.concat (str2)]
waktu rata-rata untuk 10.000 concatenations: rata-
rata waktu rata- rata untuk 0,010 ms untuk concatenations: 0,1 ms rata-
rata waktu rata- rata untuk 10000 concatations: 0,17 ms rata-
rata waktu rata- rata untuk 10000 concatenations: rata-
rata 0.255 ms rata- rata waktu untuk 10000 concatenations: rata-rata 0.336 ms avg
Dibuat string panjang: 1950000 di 9147 ms
[str1 + = str2]
waktu rata-rata untuk 10.000 concatenations: rata-
rata waktu rata- rata 0.037 ms untuk concatenations: 0,07 ms rata-
rata waktu untuk avg Rangkaian 10000: rata-
rata 0.249 ms rata- rata untuk 10.000 Rangkaian: rata-rata 0.298 ms
waktu rata-rata untuk 10.000 gabungan: 0,326 ms rata-rata.
Diciptakan string panjang: 1950000 dalam 10191 ms
[str1.append (str2)]
rata-rata waktu untuk 10.000 gabungan: rata-
rata 0,001 ms rata- rata untuk 10.000 gabungan: 0,001 ms rata-
rata waktu rata- rata untuk 10.000 penggabungan:
Rata-rata waktu 0,001 ms rata-
rata untuk 10.000
konkatasi: Rata- rata rata- rata 0,001 ms rata- rata untuk 10.000: rata- rata 0,001 ms Diciptakan panjang string: 1950000 dalam 43 ms
Patut dicatat juga bytecode:8/java.version:13
kombinasi memiliki manfaat kinerja yang baik dibandingkan denganbytecode:8/java.version:8