2014-10-14 23 views
9

Sự khác biệt hiệu suất giữa việc lấy giá trị theo khóa trong đối tượng JavaScript so với lặp qua một mảng đối tượng JavaScript riêng lẻ là gì?Đối tượng JavaScript so với hiệu suất tra cứu mảng

Trong trường hợp của tôi, tôi có đối tượng JavaScript chứa thông tin người dùng trong đó khóa là ID của người dùng và giá trị là thông tin của từng người dùng.

Lý do tôi hỏi điều này là vì tôi muốn sử dụng mô-đun angular-ui-select để chọn người dùng, nhưng tôi không thể sử dụng mô-đun đó với đối tượng Javascript - nó yêu cầu một mảng.

Bao nhiêu, nếu có, tôi có hy sinh bằng cách chuyển từ tra cứu bằng khóa, sang tra cứu bằng cách lặp lại không?

By then chốt:

var user = users[id]; 

Bằng cách lặp

var user; 

for (var i = 0; i < users.length; i ++) { 
    if (users[i].id == id) { 
    user = users[i]; break; 
    } 
} 
+2

Đừng nhầm lẫn giữa các đối tượng JavaScript với JSON! –

+0

Nó khá là không công bằng: tìm kiếm tuyến tính (vòng lặp mảng của bạn) so với truy cập gần như ngẫu nhiên (thực hiện bảng băm) – artistoex

+0

đây là một tiêu chuẩn nhanh, có thể giúp bạn: http://jsben.ch/#/Y9jDP – EscapeNetscape

Trả lời

8

Câu trả lời cho điều này phụ thuộc trình duyệt, tuy nhiên, có một vài bài kiểm tra hiệu suất trên jsperf.com về vấn đề này. Nó cũng đi xuống đến kích thước của dữ liệu của bạn. Nói chung, sử dụng cặp giá trị khóa đối tượng nhanh hơn khi bạn có một lượng lớn dữ liệu. Đối với các tập dữ liệu nhỏ, mảng có thể nhanh hơn.

Tìm kiếm mảng sẽ có hiệu suất khác nhau tùy thuộc vào vị trí mà mục tiêu của bạn tồn tại trong mảng. Đối tượng serach sẽ có hiệu suất tìm kiếm nhất quán hơn vì các phím doesen't có một thứ tự cụ thể.

Ngoài ra việc lặp qua các mảng nhanh hơn so với các khóa chia vòng lặp, vì vậy nếu bạn có kế hoạch thực hiện các thao tác trên tất cả các mục, bạn có thể đặt chúng vào một mảng. Trong một số dự án của tôi, tôi làm cả hai, vì tôi cần phải thực hiện các hoạt động hàng loạt và tra cứu nhanh chóng từ các định danh.

Xét nghiệm:

http://jsben.ch/#/Y9jDP

+0

Từ liên kết thứ hai đó có vẻ như vòng lặp for nhanh hơn bất kỳ thứ gì khác .. Tôi đã giả định rằng tra cứu trực tiếp trong một đối tượng (biết khóa) sẽ là nhanh nhất .. –

+0

Vâng, kết quả thử nghiệm màu đỏ (nhanh nhất), là tìm kiếm mảng trường hợp tốt nhất. Mục được tìm kiếm là mục đầu tiên, và tự nhiên nó là nhanh. Nếu bạn nhìn vào trường hợp xấu nhất, nơi mục tồn tại cuối cùng trong mảng, nó sẽ chậm hơn nhiều. Tìm kiếm đối tượng có hiệu suất tra cứu khá nhất quán độc lập với vị trí. –

+0

Cố định thử nghiệm của bạn với giải pháp thực hiện thích hợp: http://jsben.ch/#/UM0ju – Hatch

1

Vấn đề này chạm vào tất cả các ngôn ngữ lập trình. Nó phụ thuộc vào nhiều yếu tố:

  • kích thước của -arrays sưu tập của bạn sẽ nhận được chậm hơn khi bạn đang tìm kiếm chìa khóa cuối cùng, và mảng khá dài
  • yếu tố có thể lặp lại bản thân họ-nếu có, hơn bạn cần một mảng. Nếu không: bạn cần một từ điển (bản đồ) hoặc bạn cần viết một phương thức cộng cho mỗi lần thêm sẽ lặp lại mảng của bạn và tìm các bản sao có thể xảy ra, khi xử lý các danh sách lớn
  • sử dụng khóa trung bình - bạn sẽ mất hiệu suất, nếu userId được yêu cầu nhiều nhất nằm ở cuối danh sách.

Trong bản đồ ví dụ của bạn sẽ là giải pháp tốt hơn. Thứ hai, bạn cần phải thêm một break để mã Yor :)

var user; 

for (var i = 0; i < users.length; i ++) { 
    if (users[i].id == id) { 
    user = users[i]; break; 
    } 
} 

Hoặc bạn sẽ mất hiệu suất :)

-2

mảng kết hợp là chậm hơn sau đó mảng với chỉ số đánh số, bởi vì kết hợp các mảng công việc bằng cách thực hiện chuỗi so sánh, đó là nhiều, chậm hơn nhiều so sánh số sau đó!

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