Cách hiệu quả nhất để nối chuỗi trong JavaScript?


163

Trong JavaScript, tôi có một vòng lặp có nhiều lần lặp và trong mỗi lần lặp, tôi đang tạo ra một chuỗi lớn với nhiều +=toán tử. Có cách nào hiệu quả hơn để tạo một chuỗi? Tôi đã suy nghĩ về việc tạo ra một mảng động nơi tôi tiếp tục thêm các chuỗi vào nó và sau đó thực hiện nối. Bất cứ ai có thể giải thích và đưa ra một ví dụ về cách nhanh nhất để làm điều này?


2
Bạn đang sử dụng chuỗi để làm gì? Bất kỳ mẹo hiệu suất nào về điều này sẽ thay đổi dựa trên môi trường của bạn, kích thước chuỗi của bạn, cách một công cụ js cụ thể tối ưu hóa các hoạt động khác nhau, v.v.
Ben McCormick

1
có thể là bản sao của stackoverflow.com/questions/7299010/
Khắc

5
Kiểm tra liên kết này jsperf.com/join-concat/2
rab

Tôi đang sử dụng IE9 nhưng ở chế độ tương thích IE8 (tôi không thể thay đổi). Chuỗi lớn là thứ mà tôi sẽ chèn vào DOM bằng jquery.
omega

Câu trả lời:


135

Có vẻ dựa trên điểm chuẩn tại JSPerf rằng sử dụng +=là phương pháp nhanh nhất, mặc dù không nhất thiết phải có trong mọi trình duyệt.

Để xây dựng chuỗi trong DOM, có vẻ tốt hơn là nối chuỗi trước rồi sau đó thêm vào DOM, thay vào đó lặp lại thêm chuỗi đó vào dom. Bạn nên điểm chuẩn trường hợp của riêng bạn mặc dù.

(Cảm ơn @zAlbee đã sửa)


1
Nhìn vào trang được liên kết. Có vẻ như có rất ít sự khác biệt giữa +=và tham gia vào một mảng.
Jakub Hampl

Có vẻ như việc thêm nó vào DOM cho mọi chuỗi là 66%(Đối với IE9) nhanh hơn việc tạo một chuỗi ra khỏi chuỗi và sau đó thêm chuỗi vào DOM.
omega

trang được liên kết sử dụng + = cho cả hai thử nghiệm, không có .join () trong tầm nhìn, do đó, đây là một thử nghiệm vô nghĩa chỉ hiển thị tiếng ồn là bất kỳ "sự khác biệt" nào. ví dụ điển hình về cách js ồn ào có thể mặc dù ... dom chậm hơn chuỗi, vì vậy hãy sử dụng nó một cách tiết kiệm.
dandavis

Thời gian là một thành phần. Đối với các thói quen lặp đi lặp lại, tôi tự hỏi tác động của GC là gì giữa các phương pháp khác nhau?
David Bradley

Đối với các chuỗi lớn, Array.join có thể thích hợp hơn do lỗi bộ nhớ rất khó chịu của chuỗi concat.chromium.org/p/v8/issues/detail?id=3175
mwag 8/11/19

70

Tôi không có nhận xét nào về việc ghép nối, nhưng tôi muốn chỉ ra rằng đề xuất của @Jakub Hampl:

Để xây dựng các chuỗi trong DOM, trong một số trường hợp, có thể tốt hơn là lặp lại thêm vào DOM, thay vào đó thêm một chuỗi lớn cùng một lúc.

là sai, bởi vì nó dựa trên một bài kiểm tra thiếu sót. Bài kiểm tra đó không bao giờ thực sự nối vào DOM.

Bài kiểm tra cố định này cho thấy rằng việc tạo tất cả các chuỗi cùng một lúc trước khi kết xuất nó là nhiều, NHIỀU nhanh hơn. Nó thậm chí không phải là một cuộc thi.

(Xin lỗi, đây là một câu trả lời riêng biệt, nhưng tôi chưa có đủ đại diện để nhận xét về câu trả lời.)


4
Tôi nghĩ rằng nó đáng để tự trả lời vì nó chứa một bài kiểm tra và một kết luận (mặc dù bài kiểm tra dựa trên / lấy cảm hứng từ một câu trả lời khác, điều đó sẽ ổn thôi), không cần phải xin lỗi.
dùng202729

14

Ba năm trước kể từ khi câu hỏi này được trả lời nhưng tôi sẽ cung cấp câu trả lời của mình nào :)

Trên thực tế, câu trả lời được chấp nhận là không hoàn toàn chính xác. Thử nghiệm của Jakub sử dụng chuỗi mã hóa cứng cho phép công cụ JS tối ưu hóa việc thực thi mã (V8 của Google thực sự tốt trong công cụ này!). Nhưng ngay khi bạn sử dụng các chuỗi hoàn toàn ngẫu nhiên ( ở đây là JSPerf ) thì việc nối chuỗi sẽ ở vị trí thứ hai.


Điều thú vị với Chrome 54 và Firefox 45 trên máy Windows của tôi, concat nhanh hơn gấp đôi so với hai phiên bản khác sử dụng phiên bản của bạn. IE 11 có tất cả ba chậm như không concat trong hai trình duyệt khác.
ShawnFumo

4
Nó khác với phiên bản. Tôi đoán, ngay bây giờ VM của Chrome có thể chứa một số tối ưu hóa trước cho trường hợp này. Tôi đã thử nghiệm lại trên Chrome v53 và hiện tại, kết nối là giải pháp nhanh nhất: D Cùng một phần cứng nhưng phiên bản Chrome khác nhau cho kết quả hoàn toàn khác nhau.
Volodymyr Usarskyy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.