2011-09-10 34 views
15

Các đặc tính hiệu suất của quyền truy cập thuộc tính JavaScript (trên các triển khai hiện tại) là gì?Hiệu suất truy cập tài sản Javascript lớn-O

  • Có an toàn để giả sử truy cập mảng là O (1) không?
  • Nếu tôi sử dụng một đối tượng dưới dạng bảng băm (với khóa chuỗi), tôi có thể đảm bảo thời gian truy cập O (1) hoặc O (log n) một cách an toàn không?

  • Có bất kỳ trình duyệt hoặc môi trường phổ biến nào nhanh hơn/chậm hơn đáng kể so với các trình duyệt khác và tôi nên theo dõi không?

  • Các tiêu chuẩn JavaScript có gì để nói không?

Và quan trọng nhất:

  • Tôi có thể tìm tài liệu tham khảo tốt cho các loại hình vấn đề hiệu suất JavaScript tiệm cận ở đâu?
+0

Bạn đã tự mình nghiên cứu gì về bất kỳ câu hỏi nào trong số những câu hỏi này? –

+2

Tôi không muốn tự mình làm nhiều nghiên cứu về điều gì đó mà a) Có lẽ tôi sẽ sai và b) Rất có khả năng đã được một người thông thạo về chủ đề này rồi tôi. – hugomg

+0

Cập nhật: [Có bất kỳ điều gì đảm bảo thời gian liên tục để truy cập vào thuộc tính của một đối tượng trong JavaScript không?] (Http://stackoverflow.com/q/34292087/1048572) – Bergi

Trả lời

6

Mọi đối tượng trong JavaScript được triển khai dưới dạng băm đối tượng, do đó không có sự khác biệt về chức năng.

Ví dụ, hãy kiểm tra thử nghiệm này:

var arr = []; 
arr[5] = 5; 
arr['5'] = 'not 5'; 
console.log(arr.length, arr); 
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"] 

Các số được chuyển đổi thành chuỗi khi được sử dụng như các vị trí.

Xem Crockford's website về JavaScript để biết thêm thông tin. Phần đặc biệt quan trọng là dưới tiêu đề "Mảng":

Arrays in JavaScript are also hashtable objects.

Hiệu suất là không thực sự là một vấn đề trừ khi bạn có một tấn của các đối tượng để theo dõi (như 500,000+), trong trường hợp bạn' có thể làm điều gì đó sai. Có những tối ưu bạn có thể làm, nhưng chúng không thực sự có ý nghĩa trừ khi bạn đang làm điều gì đó không tự nhiên với JavaScript (như thuật toán nén ... Tôi đã làm việc trên một triển khai LZMA trong JS ... ý tưởng tồi).

Lưu ý:

Nếu bạn có một bộ phụ tùng (như bạn xác định chỉ có 10 chỉ số trong số 10.000), bạn có lẽ nên được sử dụng một đối tượng thông thường. Mảng sẽ khởi tạo tất cả 10.000 chỉ mục thành 'không xác định', trong khi Object.keys(obj) sẽ chỉ báo cáo 10 chỉ mục bạn đã đặt. Đây là một tối ưu hóa nhỏ mà thực sự có ý nghĩa.

+1

Tôi biết cách các đối tượng và mảng hoạt động, nhưng tôi thực sự muốn biết điều gì sẽ xảy ra với số lượng lớn. Bạn có lẽ sẽ không cần phải đi đến 500000 anyway - nếu một cái gì đó hóa ra là O (N^2) chỉ là một vài nghìn nên là đủ để bắt đầu lo lắng. – hugomg

+2

Đọc liên kết. Mảng là bảng băm. Điều này có nghĩa rằng nó có thể là O (logn) cho tra cứu (có rất nhiều tối ưu hóa ở đó).Đồng nghiệp của tôi đã chạy một số bài kiểm tra và thấy rằng nó không đáng kể cho đến khi bạn đạt trên 50.000 hoặc một thứ khác lớn. – tjameson

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