2015-12-23 11 views
6

Vấn đềCó sử dụng xóa và sau đó .push() trên hiệu suất mảng/tiêu thụ bộ nhớ không?

Sử dụng delete trên một phần tử mảng để xoá bỏ nó từ mảng là cách duy nhất tôi biết để loại bỏ một phần tử từ một mảng như vậy mà một cuộc gọi .forEach() bỏ qua chỉ số.

Câu hỏi

  • Có sử dụng delete trên một chỉ số, exampleArray[i] ví dụ, gây ra tiếp theo exampleArray.push() để tăng mức tiêu thụ bộ nhớ của đối tượng mảng?
  • Làm cách nào để xóa hiệu ứng đối tượng bộ thu gom rác?

  • Có cách nào hiệu quả hơn để thoát một yếu tố exampleArray của một yếu tố không?

Ví dụ về các cựu

var exampleArray = []; 
var n = 500; 

//Does this line imply a memory allocation? 
exampleArray.length = n; 

exampleArray.fill("Lorem Ipsum", 0); 

exampleArray.forEach(function(cur, ind, arr) { 
    if(ind % 4 === 0) { 
    delete arr[ind]; //Actually deletes the object itself, index no longer exists 
    //Length does not change, however. Does available memory? 
    } 
}, this); 

n /= 4; 

//Where, in memory, are these placed? 
while(n--) exampleArray.push("amet dolor"); 

Any help is appreciated, cảm ơn bạn.

+3

Giả định của bạn đều sai nhiều. 'delete' không phải là cách duy nhất để loại bỏ một chỉ mục khỏi một mảng, trên thực tế, nó không làm điều đó chút nào, và thậm chí không dành cho các mảng? Làm thế nào nó ảnh hưởng đến các nhà sưu tập rác, và bất cứ điều gì khác, thực sự trở nên không thích hợp sau đó? – adeneo

+0

Tôi đã không đưa ra bất kỳ giả định nào, mặc dù nó có vẻ như bạn có. Tôi nói đó là cách duy nhất tôi nhận thức được, quan tâm để khai sáng cho tôi? –

+1

@AndrueAnderson nếu bạn đang tìm kiếm câu trả lời ngắn và ngọt cho câu hỏi của bạn, chúng là 1) không 2) nó không 3) [] .splice – Andbdrew

Trả lời

7

Không sử dụng xóa trên chỉ mục, exampleArray[i] chẳng hạn, gây ra exampleArray.push() tiếp theo để tăng mức tiêu thụ bộ nhớ của đối tượng mảng?

push tăng mức tiêu thụ bộ nhớ cho dù nó có đứng trước delete hay không. Thông thường. Nếu động cơ đã được phân bổ trước khi lưu trữ cho các hạng mục bổ sung, có lẽ nó sẽ không. Nếu bạn đang tưởng tượng rằng động cơ bằng cách nào đó có thể tái sử dụng không gian được mở bởi delete để tránh phân bổ bộ nhớ bổ sung trên push tiếp theo, rất có thể là không.

Việc xóa phần tử ảnh hưởng đến bộ thu gom rác như thế nào?

Phần tử đã xóa phải tuân theo GC nếu không nằm trong phạm vi.

Có cách nào hiệu quả hơn để thoát exampleArray của một phần tử không?

Bạn phải quyết định liệu bạn có quyết định kết thúc bằng mảng thưa thớt hay không. Nếu bạn không, và khi bạn chỉ ra forEach vv bỏ qua các lỗ, sau đó delete là nhanh nhất. Nếu bạn muốn nén mảng xung quanh phần tử đã xóa, sử dụng ví dụ splice, chi phí có thể cao gấp 2 lần.

Động cơ thực hiện các chiến lược khác nhau để biểu diễn mảng nội bộ và đôi khi chuyển đổi giữa chúng - ví dụ: khi mảng đạt đến mức độ thưa thớt cụ thể. Mỗi động cơ sẽ có một chiến lược khác nhau. Cách đáng tin cậy duy nhất để trả lời các loại câu hỏi về hiệu suất này là chạy thử nghiệm hiệu suất hoặc đọc nguồn động cơ.

Điểm then chốt về GC là bạn không phải lo lắng về điều đó. Bạn không muốn nhận được vào thứ hai đoán động cơ. Bạn có thể tối ưu hóa cho một động cơ và thấy rằng hiệu suất trên một công cụ khác trở nên tồi tệ hơn.

Tất cả các câu hỏi tối ưu hóa vi mô này chỉ liên quan khi bạn có logic liên quan đến các đối tượng dữ liệu khổng lồ mà bạn đang thực hiện hàng triệu toán tử. Nếu đúng như vậy, có thể là trường hợp bạn muốn cuộn cấu trúc dữ liệu của riêng mình.

+0

THANK bạn thực sự đọc câu hỏi, và nhận thấy bối cảnh của .forEach() mà đối phó với mảng thưa thớt specifcially. Tôi ước tôi có thể chỉnh sửa bài đăng của mình để chỉ định thời gian tôi đánh giá cao. –

0

delete trong javascript có chức năng rất cụ thể: removing a property from an object. Bạn không nên cố gắng sử dụng nó để xóa các mục khỏi một mảng.

Thay vào đó, sử dụng Array.prototype.splice:

ví dụ:

var arr = [1,2,3,4]; 
arr.splice(1, 1); 

console.log(arr); // [ 1, 3, 4 ] 

Trong câu trả lời cho câu hỏi về thu gom rác thải, GC là không bị ảnh hưởng bởi các cuộc gọi đến delete trừ khi chúng xảy ra để loại bỏ các tham khảo đối với một số đối tượng . delete không buộc GC hoặc tạo điều kiện thuận lợi cho nó.

+0

downvoter care để bình luận? – Andbdrew

+0

Tôi không phải là downvoter, nhưng tôi sẽ lưu ý rằng một phần tử mảng ** là ** một thuộc tính trên một đối tượng. Chắc chắn có trường hợp sử dụng cho việc xóa, miễn là bạn không nhớ kết thúc với một mảng thưa thớt. –

+0

@torazaburo Tôi nghĩ rằng trong bối cảnh này chỉ số là tài sản, không phải là yếu tố thực tế tại chỉ số – Andbdrew

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