Việc thêm phần tử lên một triệu phần tử ArrayList
có chi phí đặt một tham chiếu ngay bây giờ và sao chép một tham chiếu trong tương lai khi số ArrayList
phải được thay đổi kích thước.Hiệu quả của việc thêm vào vectơ
Như tôi đã hiểu, việc thêm một phần tử lên một triệu phần tử PersistenVector
phải tạo một đường dẫn mới, bao gồm 4 mảng kích thước 32. Điều này có nghĩa là cần phải chạm đến hơn 120 tham chiếu.
Clojure quản lý để giữ cho chi phí véc tơ "tồi tệ hơn gấp 2,5 lần" hoặc "4 lần tệ hơn" (trái ngược với "tồi tệ hơn 60 lần"), đã được xác nhận trong một số video Clojure mà tôi đã xem gần đây? Có một cái gì đó để làm với bộ nhớ đệm hoặc địa phương của tài liệu tham khảo hoặc một cái gì đó tôi không nhận thức được?
Hoặc là bằng cách nào đó có thể xây dựng một vector nội bộ với đột biến và sau đó biến nó bất biến trước khi tiết lộ nó với thế giới bên ngoài?
Tôi đã gắn thẻ câu hỏi scala là tốt, vì scala.collection.immutable.vector
về cơ bản là giống nhau, phải không?
Vì câu hỏi bao gồm các số, nên có thể nói rõ ràng rằng vector Clojure là một cây * của các con trỏ 32 bit, mỗi cấp trong số đó chiếm năm bit của chỉ mục. Vì vậy, cây chỉ có thể có năm hoặc sáu cấp độ sâu. – Thumbnail
Điều đó có nghĩa là việc thêm vào véc tơ của Clojure chậm hơn so với nối thêm? – ZhekaKozlov
@ZhekaKozlov Có, thêm vào cuối là một hoạt động liên tục thời gian. Thêm vào đầu là tuyến tính. Tuy nhiên, nếu bạn không cần kết quả là một vectơ (hoặc ít nhất là không phải ngay lập tức), bạn có thể sử dụng kết nối lười (hoặc một cấu trúc dữ liệu khác). –