2013-08-12 32 views
5

Giả sử bạn muốn danh sách các mảng, mỗi mảng có cùng kích thước. Là nó tốt hơn hiệu suất-khôn ngoan để sử dụng một mảng 2D:Sử dụng mảng 2d so với mảng của kiểu dẫn xuất trong Fortran 90

integer, allocatable :: data(:,:) 

hoặc một loạt các loại có nguồn gốc:

type test 
    integer, allocatable :: content(:) 
end type 
type(test), allocatable :: data(:) 

Tất nhiên, đối với mảng của các kích cỡ khác nhau, chúng tôi không có sự lựa chọn. Nhưng bộ nhớ được quản lý như thế nào giữa 2 trường hợp? Ngoài ra, là một trong số họ thực hành mã tốt?

Trả lời

4

Nói chung, bạn muốn sử dụng cấu trúc dữ liệu đơn giản nhất phù hợp với vấn đề của mình. Nếu một mảng hình chữ nhật 2d đáp ứng nhu cầu của bạn - và đối với một số lượng lớn các vấn đề về máy tính khoa học, các vấn đề mà Fortran là một lựa chọn tốt, thì đó là lựa chọn mà bạn muốn.

Mảng 2d sẽ tiếp giáp trong bộ nhớ, thông thường sẽ giúp truy cập nhanh hơn cả do bộ nhớ đệm và một mức độ gián đoạn ít hơn; mảng 2d cũng sẽ cho phép bạn làm những việc như data = data * 2 hoặc data = 0. cách tiếp cận mảng-mảng không [Đã chỉnh sửa để thêm: mặc dù IanH chỉ ra trong các nhận xét bạn có thể tạo loại được xác định và các hoạt động được xác định trên các loại đó để cho phép điều này]. Những lợi thế đó là đủ lớn ngay cả khi bạn có "mảng rách rưới", nếu phạm vi độ dài hàng dự kiến ​​không lớn, việc triển khai nó như một mảng 2d hình chữ nhật đôi khi là một lựa chọn đáng xem xét.

+2

Hãy xem xét các khả năng được cung cấp bởi các hoạt động đã xác định đối với nhận xét của bạn về phép nhân và phép gán cho mảng. – IanH

+0

Đủ công bằng, nhưng nó vẫn đúng với việc sử dụng các mảng 2d giúp bạn (a) nhanh hơn (b) có ít thời gian hơn (ví dụ, d = a * b + c), (c) với cắt ở cả hai chiều tại đồng thời, tất cả (d) miễn phí. Nó vẫn sẽ có ý nghĩa hơn để làm mảng-of-mảng trong một số trường hợp, nhưng nếu bạn không cần thêm tính tổng quát, bằng cách sử dụng trường hợp đơn giản có thể có ý nghĩa. –

9

Chọn triển khai giảm thiểu khoảng cách khái niệm mà tâm trí của bạn phải nhảy giữa sự cố trong đầu của bạngiải pháp trong mã của bạn. Lực lượng của phương pháp này tăng theo độ tuổi, cả tuổi mã của bạn (thiết kế khái niệm tốt là nền tảng vững chắc cho sự phát triển trong tương lai) và tuổi của bạn (nỗ lực ít hơn để hiểu mã của bạn đòi hỏi bạn càng còn đủ năng lực về tinh thần để hiểu nó).

Đối với phần không xác định câu hỏi của bạn liên quan đến cách quản lý bộ nhớ ... Mong đợi ngây thơ của tôi là hầu hết các trình biên dịch sẽ, trong hầu hết các trường hợp, cấp phát bộ nhớ liền kề cho phần đầu tiên, và có thể không phải thứ hai. Nhưng tôi không quan tâm đến việc này để kiểm tra, và tôi cũng không nghĩ rằng bạn nên làm vậy. Tôi không, bằng cách này, cho thấy rằng bạn không nên quan tâm đến những gì đang xảy ra dưới mui xe, mà là bạn nên quan tâm nhiều hơn đến những vấn đề được đề cập trong đoạn đầu tiên.

+1

+1 - tôi càng nghĩ về điều này, "giảm thiểu khoảng cách khái niệm" có lẽ quan trọng hơn một số thước đo trừu tượng "đơn giản nhất". –

+0

chính xác là nó! bạn phải tìm sự cân bằng giữa khả năng đọc và hiệu suất ... – Girardi

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