ดูตัวอย่างด้านล่าง:
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();
}
}
เอาท์พุท:
รุ่น Java bytecode: 8
java.version: 1.8.0_144
[str1.concat (str2)]
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.096 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.185 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.327 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.501 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.656 มิลลิ AVG
สร้างสายยาว: 1950000 ใน17745 มิลลิวินาที
[str1 + = str2]
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.21 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.652 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ การต่อข้อมูล 10,000 รายการ: 1.129 ms เฉลี่ย
เวลาเฉลี่ยสำหรับการต่อข้อมูล 10,000 ครั้ง: 1.727 มิลลิวินาที
เวลาเฉลี่ยสำหรับการต่อข้อมูล 10,000 ครั้ง: 2.302 ms avg
สร้างสตริงความยาว: 1950000 ใน60279 ms
[str1.append (str2)]
เวลาเฉลี่ยสำหรับการต่อกัน 10,000 ครั้ง: 0.002 ms เวลาเฉลี่ย
เฉลี่ยสำหรับ concatenations 10,000: 0.002 ms avg
เวลาเฉลี่ยสำหรับการต่อกัน 10,000: เวลาเฉลี่ย 0.002 ms
โดยเฉลี่ยสำหรับการต่อข้อมูล 10,000 ครั้ง: 0.002 มิลลิวินาทีเฉลี่ย
เวลาเฉลี่ยในการเชื่อมต่อ 10000 ครั้ง: 0.002 มิลลิวินาทีต่อนาที AVG
สร้างสตริงที่มีความยาว: 1950000 ใน100 ms
เมื่อความยาวของสตริงเพิ่มขึ้นดังนั้นเวลาในการต่อข้อมูล
นั่นคือStringBuilder
สิ่งที่จำเป็นอย่างแน่นอน
ตามที่คุณเห็นการต่อข้อมูล: UUID.randomUUID()+"---"
ไม่มีผลต่อเวลาจริงๆ
PS:ฉันไม่คิดว่าเมื่อใดที่จะใช้ StringBuilder ใน Javaเป็นสิ่งที่ซ้ำกันจริงๆ
คำถามนี้พูดถึงเกี่ยวกับเวลาtoString()
ส่วนใหญ่ที่ไม่ทำการเรียงต่อกันของสตริงขนาดใหญ่
อัพเดต 2019
ตั้งแต่java8
ครั้งสิ่งที่มีการเปลี่ยนแปลงเล็กน้อย ดูเหมือนว่าตอนนี้ (java13) เวลากำหนดการเป็นจริงเช่นเดียวกับ+=
str.concat()
อย่างไรก็ตามเวลาที่เรียงต่อกันยังคงเป็นอย่างต่อเนื่องStringBuilder
(โพสต์ต้นฉบับด้านบนถูกแก้ไขเล็กน้อยเพื่อเพิ่มผลลัพธ์ verbose เพิ่มเติม)
รุ่น Java bytecode: 13
java.version: 13.0.1
[str1.concat (str2)]
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.047 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.1 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ 10000 concatenations: 0.17 มิลลิวินาทีโดยเฉลี่ยอาทิตย์
เวลาเฉลี่ยสำหรับ การต่อข้อมูล 10,000 ครั้ง: 0.255 มิลลิวินาทีเฉลี่ย
เวลาเฉลี่ยของการเชื่อมต่อ 10,000 ครั้ง: 0.336 มิลลิวินาทีต่อนาทีการ
สร้างสตริงของความยาว: 1950000 ใน9147 มิลลิวินาที
[str1 + = str2]
เวลาเฉลี่ยในการเชื่อมต่อ 10,000
ครั้ง: 0.097 มิลลิวินาที
โดยเฉลี่ย การต่อข้อมูล 10,000 ชุด: 0.249 ms เฉลี่ย
เวลาเฉลี่ยสำหรับการต่อข้อมูล 10,000 ชุด: 0.298 มิลลิวินาที
เวลาเฉลี่ยสำหรับการต่อข้อมูล 10,000 ครั้ง: 0.326 ms avg
สร้างสตริงของความยาว: 1950000 ใน10191 ms
[str1.append (str2)]
เวลาเฉลี่ยสำหรับการต่อกัน 10,000 ครั้ง: 0.001 มิลลิวินาทีเฉลี่ย
เวลาเฉลี่ยของการต่อกัน 10,000: 0.001 ms avg
เฉลี่ยสำหรับ 10,000 concatenations เวลาเฉลี่ย 0.001 ms avg
สำหรับการต่อข้อมูล 10,000 ครั้ง: 0.001 มิลลิวินาทีเฉลี่ย avg
เวลาการต่อเชื่อม 10,000 ครั้ง: 0.001 ms avg
สร้างสตริงความยาว: 1950000 ใน43 ms
น่าสังเกตว่าbytecode:8/java.version:13
ชุดค่าผสมยังมีประโยชน์ด้านประสิทธิภาพที่ดีเมื่อเทียบกับbytecode:8/java.version:8