2013-06-25 29 views
5

tôi có như sau:Tăng cường là gì :: hiệu quả tùy chọn?

class Obj; 
typedef std::map<string, string> StrMap; 
std::map<std::string, std::pair<Obj, StrMap> > complexMap; 

Cái này là đối với một số mục trong complexMap các StrMap sẽ trống và tôi sẽ không sử dụng nó ở tất cả, vì vậy hiệu quả Tôi đang xem xét sử dụng tăng :: không bắt buộc. Câu hỏi của tôi là hiệu quả của boost là gì: tùy chọn, tôi sợ rằng bằng cách trả giá của nó, tôi sẽ không đạt được gì ở cuối.

+4

Bạn đã lược tả mã của mình và xác định rằng có một nút cổ chai hiệu suất do việc tạo bản đồ trống? –

+1

@LucTouraille, Không. Tôi chỉ muốn có hiệu suất cao nhất mà tôi có thể đạt được. – Subway

+1

Bạn đang cân nhắc lựa chọn nào? Cách tìm "hiệu suất cao nhất" là lập hồ sơ các giải pháp khác nhau và chọn giải pháp có hiệu suất cao nhất. – juanchopanza

Trả lời

5

Hãy suy nghĩ về optional như một container có thể chứa 0 hoặc 1 giá trị. Bản đồ của bạn đã là một vùng chứa có thể chứa 0 đến N phần tử. Do đó, bản đồ tùy chọn là một vùng chứa trong một vùng chứa có thể chứa 0 đến N phần tử. Thực sự, không có lợi ích ở đây.

Chi phí của bản đồ trống là khá nhỏ. Bản đồ thực sự được xây dựng từ các nút bản đồ, nội bộ và một bản đồ trống không có bất kỳ nút nào.(Không thể, bởi vì mỗi nút giữ một giá trị và không có cách nào mà bản đồ trống có thể tạo giá trị mặc định)

+0

Đơn giản và rõ ràng. Cảm ơn! – Subway

2

Nếu bạn đang làm một tính toán "thưa thớt", bạn có thể làm hai việc:

  1. giữ một lượng lớn complexMap chứa rất nhiều kết quả không tồn tại với một boost::optional. Phần này đóng gói độ thưa thớt trên cơ sở trên mỗi phần tử.
  2. tạo thêm một lớp vô hướng (unordered_map ví dụ) có chứa con trỏ đến các phần tử hiện có trong complexmMap của bạn. Điều này đóng gói độ thưa thớt trên cơ sở trên mỗi bản đồ.

Phương án 1 sẽ thuận tiện hơn cho bạn với tư cách là lập trình viên, đòi hỏi ít chi phí cho việc chi phí không gian. Phương án 2 sẽ gần như hoàn toàn không gian hiệu quả và giữ cho complexMap càng nhỏ càng tốt, nhưng yêu cầu phải lập trình nhiều hơn ở phía trước.

Chọn tùy chọn thay thế nào có thể chấp nhận được hơn (gợi ý: nếu bạn đang tính toán gigabyte ở mức complexMap, có thể mức bổ sung vô nghĩa sẽ giảm, nếu không tôi sẽ không làm phiền).

Khác với chi phí trên không, có một ít chi phí khác cho boost::optional, vì nó không yêu cầu một hàm tạo mặc định hoặc cấp phát bộ nhớ động.

2

Di chuyển các bình luận cho một câu trả lời ...

suy nghĩ về cách thức bắt buộc được thực hiện, nó thường có một số lưu trữ nội bộ (để cho phép nó vào giữ đồ vật - như bạn làm trong mã của bạn ở trên) và sự khác biệt duy nhất là nó không xây dựng bản đồ trong bộ nhớ đó - điều này được để lại sau này. Tuy nhiên, đối tượng tùy chọn phải được xây dựng. Vì vậy, bây giờ thay vì chỉ xây dựng một bản đồ, bạn đang xây dựng một đối tượng tùy chọn lớn hơn trong trường hợp bạn không sử dụng bản đồ và khi bạn sử dụng bản đồ, bạn cũng phải xây dựng bản đồ đó. Có vẻ như bạn đang làm nhiều việc hơn vì lợi ích ít.

Có trường hợp optional có ý nghĩa (ví dụ: giá trị trả về, ví dụ bạn muốn chỉ định trạng thái không hợp lệ hoặc bạn có một hàm tạo rất đắt tiền thực hiện rất nhiều lần khởi tạo thành viên phức tạp) các nhà xây dựng, tùy chọn thực sự không phải là giá trị lộn xộn mã.

Disclaimer: Nhưng như với tất cả các câu hỏi liên quan thực hiện, hồ sơ, hồ sơ và sau đó hồ sơ một lần nữa ...

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