2017-09-05 17 views
11

Câu hỏi đơn giản: có một công đức nào khi sử dụng một vật thể nông cạn hơn một vật sâu hơn không? Khi tôi viết mã, tôi có xu hướng sử dụng một đối tượng sâu để dễ hiểu và phân loại. Nhưng tôi tự hỏi nếu tùy chỉnh này làm cho mã của tôi chậm hơn.Đối tượng sâu có chậm trong JavaScript không? Nếu có bao nhiêu

Tôi đã thực hiện kiểm tra nhưng tôi không biết liệu tôi có đang thực hiện chính xác hay không.

//building necessary objects 
 
var a = {}; 
 
var b; 
 
b = a; 
 
for (var i = 0; i < 100; i++) { 
 
    b["a"] = {}; 
 
    b = b["a"]; 
 
} 
 
var c = {}; 
 

 
//objects used 
 
//a.a.a. ..(101 "a"s).. .a === {} 
 
//c === {} 
 

 
//1st test: shallow 
 
var d; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    d = c; 
 
    d = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Shallow: ' + (end - start)); 
 

 
//2nd test: deeper 
 
var e; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    e = a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a; 
 
    e = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Deeper: ' + (end - start));

kết quả (mili giây):

shallow 3229 3304 3246 3253 3277 
deep 3375 3343 3247 3193 3248 

Bài kiểm tra lần cho đối tượng sâu không phải là chậm, nhưng đôi khi thậm chí nhanh hơn so với một nông. Mặc dù kết quả, tôi không đủ tự tin để kết luận rằng chúng có cùng tốc độ. Có sự khác biệt nào giữa hai trong số chúng không?

+0

Chắc chắn bạn đang đùa? 1 tỷ hoạt động chỉ trong hơn 3 giây và bạn đang quibbling khoảng có lẽ ± 100 ops? Ngay cả đối với một trường hợp xấu nhất contrived? Đây là tối ưu hóa sớm writ lớn! Sự chênh lệch trong việc triển khai và hệ thống sẽ lớn hơn bất kỳ thay đổi nhỏ nào về hiệu suất giữa hai hệ thống. – RobG

+0

Các loại kiểm tra tốc độ như vậy không bao giờ thực sự hữu ích. Bạn kiểm tra một số đoạn mã nhân tạo sẽ không bao giờ được sử dụng theo cách như vậy trong mã thực, có khả năng là trình tối ưu hóa công cụ js sẽ hoạt động hoàn toàn khác trên ví dụ này, sau đó trên mã thực. –

+0

Truy cập lồng nhau sẽ chậm hơn nói chung, nhưng sự khác biệt là quá nhỏ để quan trọng thực sự như một truy cập tài sản là một hoạt động 'O (1)' nhanh. Lưu ý các yếu tố và quy trình khác trên máy tính của bạn có thể đóng góp vào những khác biệt nhỏ về thời gian đó. –

Trả lời

3
  1. Bạn đang sử dụng mã không thực tế để kiểm tra "mã thực", mà là vô nghĩa
  2. Bạn sử dụng Date.now() mà là xấp xỉ với dấu thời gian và bạn nên sử dụng performance.now() để kiểm tra tốc độ js. Hiện tại, ngay cả với mã kiểm tra tốt, bạn vẫn nhận được kết quả sai.
  3. Các công cụ JS luôn cập nhật. Có những lúc vật thể sâu chậm, nó không còn là trường hợp nữa trong x năm qua. Đó là một vấn đề cũ mà tôi thậm chí không thể nhớ được những năm tháng hay google có giá trị gì.
+1

Cảm ơn bạn đã cho điểm rõ ràng. –

+0

Điều tôi muốn biết một phần là nếu tôi thử nghiệm nó một cách chính xác. performance.now() trông đẹp hơn nhiều. –

1

Đây là một tối ưu hóa trong công cụ js để truy cập trực tiếp vào đối tượng và cho phép đối tượng sâu được đổi thành tiền trong một biến mất ít thời gian hơn để tiếp cận. Vì vậy, nó là nhanh hơn để truy cập chúng mà không cần phải đi qua chuỗi. Ví dụ:

var a={a:{a:{}}} 
var b=a.a.a 
var c=b 
// is faster than 
var c=a.a.a 

Để biết thêm thông tin đọc: JavaScript Performance: Mutiple variables or one object?

+0

Tôi không chắc chắn những gì bạn có ý nghĩa ở đây. Điều này dường như không trả lời câu hỏi về cách truy cập lồng nhau sâu chậm như thế nào. –

+0

Tôi đã chỉnh sửa nó để làm cho nó rõ ràng hơn – user7951676

+0

Bạn có nói rằng OP cần phải lưu trữ giá trị của 'a.a.a' theo cách thủ công trong biến khác và sử dụng công cụ đó hoặc động cơ của chúng đang hoạt động và lưu trữ giá trị tự động không? Nếu bạn có nghĩa là OP cần phải làm 'b = a.a.a' thì đây là một công việc-a-xung quanh một câu trả lời cho cách truy cập đối tượng lồng nhau nhanh như thế nào. –

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