2015-01-07 19 views
5

Tôi hiểu mảng array.count (số phần tử trong mảng). Số lượng hữu ích khi lặp qua các phần tử của mảng. Tôi loại có được các ý chính của array.capacitySwift array.capacity vs array.count

capacity Giá trị số nguyên đại diện cho bao nhiêu tổng yếu tố mảng có thể lưu trữ mà không cần phân bổ lại (read-only).

Thử nghiệm

Tôi đã được chơi với các sân chơi và nhận thấy khả năng của một mảng được một số chẵn (tăng thêm 2)

var arr = [1, 2, 3 , 4, 5, 6, 7] 
arr.removeLast() // capacity stays the same after a removal 
println(arr.capacity) // 8 
println(arr.count) // 6 

var arr = [1, 2, 3 , 4, 5, 6] 
arr.removeLast() 
println(arr.capacity) // 6 
println(arr.count) // 5 

Câu hỏi

gì sử dụng dung lượng mảng là gì? Xin cho một ví dụ cụ thể?

+0

Afaik nó chỉ là một cách để giải phóng không gian bộ nhớ. Bạn sẽ có thể tìm thấy nó với một tìm kiếm của Google mặc dù. Không thực sự là một câu hỏi SO. Ngoài ra, tại sao bạn cần phải biết? Được tính không đủ tốt? – Fogmeister

Trả lời

14

Dung lượng của mảng — cụ thể là phương pháp reserveCapacity — cho phép bạn preallocate không gian trong mảng.

Nếu bạn đang thêm các phần tử vào một mảng và bạn vượt quá dung lượng của nó, thì mảng phải tăng dung lượng của nó. Kể từ khi một mảng Swift lưu trữ các phần tử của nó liên tục trong bộ nhớ, nó phải phân bổ lại bộ nhớ trong của nó và (thường) sao chép tất cả các phần tử của nó từ bộ nhớ cũ sang bộ nhớ mới. (Lưu ý rằng NSArray không ghi chép để lưu trữ phần tử của nó liên tục kế nhau, nhưng chúng ta có thể suy luận rằng Swift Mảng có lẽ dựa trên sự tồn tại của phương pháp withUnsafeMutableBufferPointer.)

Nếu bạn biết trước bao nhiêu yếu tố mà bạn có ý định thêm vào mảng, bạn có thể sử dụng phương thức reserveCapacity để cài đặt trước dung lượng của mảng sao cho nó không cần thực hiện bất kỳ sự tái phân bổ nào (và sao chép liên quan).

Lý do duy nhất tôi có thể nghĩ đến để đặt một mảng cho khả năng của nó là tìm hiểu cách thức hoạt động của hệ thống và gỡ lỗi một vấn đề hiệu suất.

Thông thường bạn không cần phải lo lắng về khả năng đặt trước. Sự phân bổ lại hiếm khi là vấn đề hiệu suất. Swift sử dụng (tôi tin) một lịch trình phân bổ lại hiệu quả sao cho số lượng các phân bổ lại là logarit trong tổng số cuối cùng của mảng. Ví dụ. nếu bạn thêm một triệu phần tử tại một thời điểm, Swift sẽ thực hiện không quá 20-30 phân bổ lại.Nhưng nếu bạn biết mảng của bạn sẽ rất lớn (như gigabyte trên máy Mac hoặc hàng chục megabyte trên thiết bị iOS) hoặc nếu bạn đang lấp đầy mảng trong đường dẫn mã hiệu suất nhạy cảm (ví dụ: điền âm thanh bộ đệm sẽ bắt đầu phát trong micro giây), bạn có thể muốn đặt trước dung lượng và tránh phân bổ lại. Bạn có lẽ không nên lo lắng về khả năng dự trữ trừ khi bạn biết reallocations là một vấn đề, hoặc bởi vì profiler cho thấy rằng họ là một nút cổ chai hoặc bởi vì bạn có bằng chứng khác (như âm thanh ổn trong ví dụ đệm âm thanh).

4

việc sử dụng công suất mảng

Về cơ bản, năng lực mảng có không sử dụng bên ngoài là gì. Nó ở đó để sử dụng nội bộ của Swift. Nếu bạn biết rằng bạn sẽ phân bổ 100 đối tượng cho mảng này, bạn có thể đặt khả năng trước khi bạn tạo mảng và tôi đã thấy một số người làm điều đó trong mã của họ; nhưng không có cụ thể cần để làm như vậy và không có cụ thể nào được hưởng khi làm như vậy. Bạn đã nhìn dưới mui xe và nhìn thấy một cái gì đó bạn không thực sự cần phải xem. Bây giờ bạn đã thấy, bạn có thể quên nó.

+0

"Bây giờ bạn đã thấy, bạn có thể quên nó." :) Bạn có thể đưa ra một ví dụ làm thế nào nó có thể hữu ích cho việc sử dụng bên ngoài? –

+0

@raychenon tại sao? Với các nhà phát triển NSArray Apple đặc biệt nản lòng khi sử dụng arrayWithCapacity và chỉ cho phép mọi thứ hoạt động riêng. Tại sao bạn cần một ví dụ về cách sử dụng một cái gì đó mà bạn có lẽ nên không bao giờ sử dụng? – Fogmeister

+0

@Fogmeister vì ai đó chưa thể hiện năng lực có thể hữu ích như thế nào. Chỉ cần một câu hỏi trước khi tôi ngủ :) –

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