2013-02-10 42 views
13

Xóa rõ ràng Seq thực hiện tương tự hoặc tốt hơn như [] cho tất cả các hoạt động có thể có. Nhưng vì cấu trúc của nó phức tạp hơn các danh sách, với kích thước nhỏ, chi phí không đổi của nó có thể sẽ làm cho nó chậm hơn. Tôi muốn biết số tiền, cụ thể:Data.Sequence.Seq nhanh như thế nào so với []?

  1. Bao nhiêu chậm hơn là <| so với :?
  2. Tốc độ chậm hơn gấp/vượt qua số Seq so với xếp chồng/di chuyển ngang số [] (không bao gồm chi phí của chức năng gấp/vượt qua)?
  3. Kích thước (xấp xỉ) là gì \xs x -> xs ++ [x] trở nên chậm hơn |>?
  4. Kích thước (xấp xỉ) mà ++ trở nên chậm hơn >< là bao nhiêu?
  5. Chi phí gọi viewl và khớp mẫu trên kết quả so với kết hợp mẫu trên danh sách là gì?
  6. Bộ nhớ có bao nhiêu bộ nhớ n -element Seq chiếm so với danh sách liên kết n? (Không tính bộ nhớ bị chiếm đóng bởi các phần tử, chỉ cấu trúc.)

Tôi biết rằng khó đo lường, vì Seq chúng tôi nói về sự phức tạp phân bổ, nhưng tôi muốn biết ít nhất một số thô .

+6

Không so sánh như vậy tồn tại. Tôi khuyên bạn nên tự mình tạo bằng cách sử dụng thư viện đo điểm chuẩn. –

+6

Nếu ai đó cuối cùng quyết định thực hiện điểm chuẩn trên trang này, điều đó sẽ tạo ra rất nhiều ý nghĩa để cũng thả vào một 'Vector' để so sánh. Sẽ rất tốt đẹp để xem kết quả. Yêu thích cái này. –

+2

Điều này cũng khó (hoặc không đặc biệt hữu ích) vì trong mã thực, với GHC, danh sách trung gian có xu hướng hợp nhất và viết lại và biến mất, làm cho chúng giống cấu trúc điều khiển hơn cấu trúc dữ liệu. – jberryman

Trả lời

13

này nên được một sự khởi đầu - http://www.haskell.org/haskellwiki/Performance#Data.Sequence_vs._lists

Một chuỗi sử dụng giữa 5/6 và 4/3 lần so với không gian nhiều như danh sách tương đương (giả định một overhead của một từ mỗi nút, như trong GHC). Nếu chỉ sử dụng các hoạt động deque, việc sử dụng không gian sẽ gần cuối dưới của phạm vi, bởi vì tất cả các nút bên trong sẽ là số ba. Việc sử dụng phân tách và nối thêm nhiều sẽ dẫn đến các chuỗi sử dụng khoảng không gian tương tự như danh sách. Cụ thể:

  • danh sách độ dài n bao gồm n nút điều khiển, mỗi nút chiếm 3 từ.
  • một chuỗi độ dài n có khoảng n/(k-1) nút, trong đó k là độ trung bình của các nút bên trong (mỗi 2 hoặc 3). Có một con trỏ, kích thước và chi phí cho mỗi nút, cộng với một con trỏ cho mỗi phần tử, tức là n (3/(k-1) + 1) từ.

Danh sách là yếu tố không liên tục nhỏ hơn cho hoạt động ở đầu (khuyết điểm và đầu), làm cho nó trở thành lựa chọn hiệu quả hơn cho các mẫu truy cập giống như ngăn xếp và giống như luồng. Data.Sequence là nhanh hơn cho mỗi mẫu truy cập khác, chẳng hạn như hàng đợi và truy cập ngẫu nhiên.

1

Tôi có thêm một kết quả cụ thể để thêm vào câu trả lời ở trên. Tôi đang giải một phương trình Langevin. Tôi đã sử dụng List và Data.Sequence. Rất nhiều chèn ở phía sau của danh sách/chuỗi đang diễn ra trong giải pháp này.

Tóm lại, tôi không thấy bất kỳ cải thiện nào về tốc độ, trên thực tế hiệu suất bị giảm xuống theo Trình tự. Hơn nữa với Data.Sequence, tôi cần phải tăng bộ nhớ có sẵn cho Haskell RTS.

Vì tôi chắc chắn không phải là cơ quan về tối ưu hóa; Tôi đăng cả hai trường hợp dưới đây. Tôi rất vui khi biết liệu điều này có thể được cải thiện hay không. Cả hai mã đều được biên dịch với cờ -O2.

  1. Solution with List, mất khoảng 13,01 giây
  2. Solution with Data.Sequence, mất khoảng 15,13 giây
+0

Trình tự/danh sách của bạn trong bao lâu? –

+0

Cả hai người trong số họ có 10^6 yếu tố. – Dilawar

+1

Nếu có ai ở đây, tôi đã kiểm tra mã được liên kết từ tò mò và trên máy seq của tôi nhanh hơn một chút. (~ 5%) Nó cũng là một ví dụ xấu vì ở đây hai trường hợp so sánh sôi xuống để xây dựng một danh sách bằng cách gắn ở phía trước và đảo ngược. Hoặc xây dựng Seq bằng cách thêm vào cuối và sau đó chuyển đổi nó thành một danh sách thay vì sử dụng nó trực tiếp. Nhưng ngay cả sau đó trên danh sách Máy của tôi chậm hơn vì vậy tôi tưởng tượng sự khác biệt về tốc độ mà không phải do sự lựa chọn Cấu trúc dữ liệu mà là các thay đổi khác trong mã. –

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