2011-10-09 41 views
38

Tôi chỉ đọc câu hỏi này: are there dictionaries in javascript like python?Hiệu suất tra cứu chính trong đối tượng JavaScript

Một trong những câu trả lời cho biết bạn có thể sử dụng các đối tượng JavaScript như từ điển Python. Điều đó có đúng không? Hiệu suất của một tra cứu khóa trong một đối tượng là gì? Có phải O (1) không? Việc thêm một khóa vào đối tượng cũng không đổi thời gian (băm)?

Trả lời

46

Các V8 design docs bao hàm tra cứu sẽ có ít nhất này nhanh chóng, nếu không nhanh hơn:

Javascript Hầu hết sử dụng một cấu trúc dữ liệu từ điển giống như như lưu trữ đối với tài sản đối tượng - mỗi truy cập bất động sản đòi hỏi một tra cứu động để giải quyết vị trí của thuộc tính trong bộ nhớ. Cách tiếp cận này giúp việc truy cập các thuộc tính trong JavaScript thường kém hơn chậm hơn truy cập các biến mẫu trong các ngôn ngữ lập trình như Java và Smalltalk. Trong các ngôn ngữ này, các biến mẫu được đặt tại các giá trị cố định được xác định bởi trình biên dịch do đối tượng cố định bố cục được xác định bởi lớp của đối tượng. Truy cập chỉ đơn giản là vấn đề tải hoặc lưu trữ bộ nhớ , thường chỉ yêu cầu một lệnh duy nhất.

Để giảm thời gian cần thiết để truy cập các thuộc tính JavaScript, V8 thực hiện không sử dụng tra cứu động để truy cập các thuộc tính. Thay vào đó, động cơ V8 tạo các lớp ẩn đằng sau hậu trường. [...] Trong V8, một đối tượng thay đổi lớp ẩn của nó khi thêm thuộc tính mới.

Có vẻ như việc thêm khóa mới có thể chậm hơn một chút, do việc tạo lớp ẩn.

+0

Cảm ơn Domenic! vì vậy nó có vẻ là an toàn cho tôi để sử dụng tra cứu đối tượng như tra cứu từ điển nếu tôi làm tra cứu nhiều hơn băm. –

+0

Đối với V8, có đúng là tra cứu động không được sử dụng cho cả ký hiệu dấu chấm cũng như ký hiệu dấu ngoặc vuông? –

15

Có, bạn có thể giả định rằng thêm khóa và sau đó sử dụng khóa để truy cập là hiệu quả hoạt động liên tục trong thời gian.

Dưới mui xe, công cụ JS có thể áp dụng một số kỹ thuật để tối ưu hóa các lần tra cứu tiếp theo, nhưng với mục đích của bất kỳ thuật toán nào, bạn có thể giả sử O (1).

Các vấn đề liên quan