2010-04-21 22 views
6

Tôi đã tự hỏi liệu sử dụng nguyên mẫu trong JavaScript nên được nhiều bộ nhớ hiệu quả hơn gắn mọi thành viên của một đối tượng trực tiếp đến nó vì những lý do sau đây:Thừa kế nguyên mẫu nên tiết kiệm bộ nhớ, phải không?

  • Nguyên mẫu chỉ là một đối tượng duy nhất.
  • Các trường hợp tổ chức chỉ tham chiếu đến các nguyên mẫu của họ.

Versus:

  • Mỗi dụ giữ một bản sao của tất cả các thành viên và phương pháp được xác định bởi các nhà xây dựng.

tôi bắt đầu một chút thí nghiệm với điều này:

var TestObjectFat = function() 
    { 
     this.number = 42; 
     this.text = randomString(1000); 
    } 

var TestObjectThin = function() 
    { 
     this.number = 42; 
    } 
TestObjectThin.prototype.text = randomString(1000); 

randomString(x) chỉ sản xuất một, tốt, String ngẫu nhiên có độ dài x.

sau đó tôi khởi tạo các đối tượng với số lượng lớn như thế này:

var arr = new Array(); 
for (var i = 0; i < 1000; i++) { 
    arr.push(new TestObjectFat()); // or new TestObjectThin() 
} 

và kiểm tra việc sử dụng bộ nhớ của quá trình duyệt (Google Chrome). Tôi biết, đó không phải là rất chính xác ...

Tuy nhiên, trong cả hai trường hợp sử dụng bộ nhớ tăng lên đáng kể như mong đợi (khoảng 30 MB cho TestObjectFat), nhưng các biến thể nguyên mẫu sử dụng ít không nhiều bộ nhớ (khoảng 26 MB cho TestObjectThin).

Tôi cũng đã kiểm tra rằng các phiên bản TestObjectThin có chứa cùng một chuỗi trong thuộc tính "văn bản" của chúng, do đó chúng thực sự đang sử dụng thuộc tính của mẫu thử nghiệm.

Bây giờ, tôi không phải như vậy chắc chắn phải nghĩ gì về việc này. Prototyping dường như không phải là bộ nhớ tiết kiệm lớn cả.

Tôi biết rằng mẫu là một ý tưởng tuyệt vời vì nhiều lý do khác, nhưng tôi đặc biệt quan tâm đến việc sử dụng bộ nhớ ở đây. Bất kỳ giải thích tại sao biến thể nguyên mẫu sử dụng gần như cùng một lượng bộ nhớ? Tui bỏ lỡ điều gì vậy?

Trả lời

2

thử nghiệm của bạn là nghi ngờ - có một chi phí đáng kể trong việc phân bổ đối tượng JavaScript mà có khả năng làm lệch kết quả của bạn. Nếu bạn chèn các khối dữ liệu lớn vào lớp nguyên mẫu của mình, nó có thể hiển thị mức tăng lớn hơn.

Thật không may sử dụng bộ nhớ rất khó để kiểm soát trong JavaScript, đặc biệt là khi JIT có liên quan (là phương pháp JITed của bạn đại diện trong mô hình sử dụng bộ nhớ? Vv).

+0

Tôi có thể dùng thử với các chuỗi dài hơn trong thuộc tính đối tượng. Có lẽ điều đó sẽ cho thấy một sự khác biệt ... – selfawaresoup

1

Trong cả hai trường hợp, bạn đã tạo 1000 đối tượng và một đối tượng là nặng hơn nhiều trong bộ nhớ hơn là một chuỗi. Thin vs Fat thể hiện mức tăng của 999 chuỗi. Vì vậy, chúng ta hãy nói rằng việc tạo ra một đối tượng (thậm chí là một đối tượng đơn giản) có giá 26k, và việc tạo ra 1000 chuỗi ký tự có giá trị là 4k. Sau đó, quan sát của bạn được giải thích một cách hoàn hảo.

Fat = 1000 * 26Ko + 1000 * 4Ko = 30Mo 
Thin = 1000 * 26Ko + 4Ko = 26Mo 
+0

Tôi có một thời gian khó tin rằng một đối tượng đơn giản như thế này sử dụng hết bộ nhớ trong các đơn đặt hàng của cường độ. Bạn có chắc chắn về điều đó không? – selfawaresoup

+0

Tuyệt đối không. Tôi chỉ muốn chứng minh rằng kết quả của bạn có thể được giải thích. – Alsciende

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