2013-02-06 31 views
12

Tôi đang sử dụng Buffer có thể thay đổi và cần tìm hiểu xem có bao nhiêu phần tử.Scala Buffer: Kích thước hoặc Độ dài?

Cả hai phương pháp sizelength được xác định, được kế thừa từ các đặc điểm riêng biệt.

Có sự khác biệt hiệu suất thực tế nào không hoặc chúng có được coi là từ đồng nghĩa chính xác không?

+2

Cá nhân tôi là một bộ chọn lọc ngữ nghĩa, vì vậy tôi chỉ sử dụng 'độ dài' cho những thứ tuyến tính hoặc tuần tự và' kích thước' ngược lại. –

Trả lời

15

Họ là những từ đồng nghĩa, chủ yếu là kết quả của quyết định của việc có size cho bộ sưu tập và length cho ArrayString Java. Người ta sẽ luôn luôn được định nghĩa về mặt khác, và bạn có thể dễ dàng nhìn thấy cái nào bằng cách xem mã nguồn, liên kết được cung cấp trên scaladoc. Chỉ cần tìm đặc điểm xác định, mở mã nguồn và tìm kiếm def size hoặc def length.

+0

Cảm ơn! Tôi không biết mã nguồn có thể truy cập trực tuyến thông qua scaladoc. Điều này là khá tốt đẹp! – Eduardo

2

Họ là những từ đồng nghĩa, như scaladoc cho Buffer.size trạng thái:

Kích thước của bộ đệm này, tương đương với chiều dài.

Các scaladoc cho Buffer.length là rõ ràng quá:

Chiều dài của bộ đệm. Lưu ý: xs.length và xs.size mang lại kết quả tương tự.

Lời khuyên đơn giản: tham khảo scaladoc trước khi đặt câu hỏi.

CẬP NHẬT: Chỉ cần nhìn thấy chỉnh sửa của bạn thêm đề cập đến hiệu suất. Là trợ giúp của Daniel C. Sobral, người ta thường luôn thực hiện việc này với nhau, vì vậy họ có cùng hiệu suất.

+0

Tôi đã thực sự tự hỏi nếu có bất kỳ sự khác biệt hiệu suất? Ví dụ, một được lưu trữ như là một thuộc tính thực tế trong cấu trúc dữ liệu, so với cái khác phải lặp qua tất cả các giá trị (như với một List) để trả về cùng một giá trị. – Eduardo

+0

Tôi đã chỉnh sửa câu hỏi của mình rõ ràng hơn – Eduardo

5

Trong trường hợp này, chúng có thể được coi là từ đồng nghĩa. Bạn có thể muốn xem với một số trường hợp khác như Array - trong khi chiều dài và kích thước sẽ luôn trả về cùng một kết quả, trong các phiên bản trước Scala 2.10 có thể có chi phí đấm bốc để gọi size (được cung cấp bởi trình bao bọc Scala xung quanh Mảng), trong khi length được cung cấp bởi Java Array cơ bản.

Trong Scala 2.10, phí trên này đã bị xóa bằng cách sử dụng lớp giá trị cung cấp phương thức size, vì vậy bạn nên sử dụng bất kỳ phương pháp nào bạn thích.

+0

Tôi chỉ lược tả mã Scala 2.11 và gọi 'kích thước' trên một mảng tạo một đối tượng. Bạn vẫn nên tránh nó trong mã hiệu suất quan trọng. – mattg

2

Kể từ Scala-2.11, các phương pháp này có thể có hiệu suất khác nhau. Ví dụ: hãy xem xét mã này:

val bigArray = Array.fill(1000000)(0) 
val beginTime = System.nanoTime() 
var i = 0 
while (i < 2000000000) { 
    i += 1 
    bigArray.length 
} 
val endTime = System.nanoTime() 
println(endTime - beginTime) 
sys.exit(-1) 

Chạy trên máy tính amd64 của tôi có khoảng 2423834 nanos (thay đổi theo thời gian).

Bây giờ, nếu tôi thay đổi phương pháp length thành size, thời gian sẽ trở thành khoảng 70764719 nanos.

Đây là hơn 20x chậm hơn.

Tại sao điều đó xảy ra? Tôi không đào nó qua, tôi không biết.Nhưng trường hợp trong đó lengthsize hoạt động mạnh mẽ khác nhau.

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