2010-03-01 35 views
8

Tôi đang viết một ứng dụng được nhúng. Ở một số nơi, tôi sử dụng std :: ostringstream rất nhiều, vì nó rất thuận tiện cho mục đích của tôi. Tuy nhiên, tôi chỉ phát hiện ra rằng hiệu suất hit là cực đoan kể từ khi thêm dữ liệu vào luồng kết quả trong rất nhiều cuộc gọi đến malloc và miễn phí. Có cách nào để tránh nó không?Có cách nào để giảm ostocstream malloc/miễn phí?

Suy nghĩ đầu tiên của tôi là tạo static tĩnh mạch và đặt lại nó bằng cách sử dụng ostringstream :: set (""). Tuy nhiên, điều này không thể được thực hiện khi tôi cần các chức năng để được reentrant.

+0

Dupe http://stackoverflow.com/questions/1941064/should-i-preallocate-stdstringstream –

+0

Hmm ... câu hỏi dupe không đưa ra câu trả lời hợp lệ. –

+0

Bên cạnh đó, "dupe" trước giả định một câu trả lời. – MSalters

Trả lời

2

Vâng, giải pháp của Booger sẽ chuyển sang sprintf(). Nó không an toàn và dễ xảy ra lỗi, nhưng nó thường nhanh hơn.

Không phải lúc nào cũng vậy. Chúng tôi không thể sử dụng nó (hoặc ostringstream) trên công việc thời gian thực của tôi sau khi khởi tạo vì cả hai thực hiện phân bổ bộ nhớ và deallocations.

Cách của chúng tôi xung quanh vấn đề là nhảy qua rất nhiều vòng để đảm bảo rằng chúng tôi thực hiện tất cả chuyển đổi chuỗi khi khởi động (khi chúng tôi không phải là thời gian thực). Tôi nghĩ rằng có một tình huống mà chúng tôi đã viết bộ chuyển đổi của riêng mình thành một mảng phân bổ có kích thước cố định. Chúng tôi có một số hạn chế về kích thước chúng tôi có thể dựa vào các chuyển đổi cụ thể được đề cập. Đối với một giải pháp tổng quát hơn, bạn có thể xem xét việc viết phiên bản ostringstream của riêng bạn sử dụng bộ đệm có kích thước cố định (tất nhiên là kiểm tra lỗi trên các giới hạn). Nó sẽ là một chút công việc, nhưng nếu bạn có một lô hàng của những hoạt động đó, điều đó có thể đáng giá.

+0

Bạn sử dụng thay thế nào? –

+0

Tôi bắt đầu thêm, nhưng đã được sao lưu. Tôi sẽ tiếp tục và đưa nó vào cho bạn. –

+0

Bạn ít nhất có thể sử dụng snprintf (với một bộ đệm ngăn xếp), nhưng tôi vẫn sẽ không ủng hộ điều này trừ khi hồ sơ cho thấy nó cung cấp lợi ích bạn cần và bạn quyết định những hạn chế có giá trị sử dụng nó. –

2

Nếu bạn biết dữ liệu lớn như thế nào trước khi tạo luồng, bạn có thể sử dụng ostrstream có hàm tạo có thể lấy bộ đệm làm tham số. Do đó sẽ không có quản lý bộ nhớ của dữ liệu.

2

Có lẽ cách được chấp thuận để xử lý việc này sẽ là tạo đối tượng basic_stringbuf của riêng bạn để sử dụng với ostringstream của bạn. Đối với điều đó, bạn có một vài lựa chọn. Người ta sẽ sử dụng một bộ đệm có kích thước cố định, và có overflow chỉ đơn giản là thất bại khi/nếu bạn cố gắng tạo đầu ra quá dài. Một khả năng khác là sử dụng một vectơ làm bộ đệm. Không giống như std :: string, vector đảm bảo rằng dữ liệu phụ thêm sẽ có độ phức tạp liên tục được phân bổ. Nó cũng không bao giờ giải phóng dữ liệu từ bộ đệm trừ khi bạn ép buộc nó, vì vậy nó thường sẽ phát triển đến kích thước tối đa mà bạn đang xử lý. Từ thời điểm đó, nó không nên cấp phát hoặc giải phóng bộ nhớ trừ khi bạn tạo một chuỗi vượt quá độ dài mà nó hiện có sẵn.

+0

Tôi đã kiểm tra nguồn gốc của việc triển khai STL mà tôi đang sử dụng, nếu tôi chuyển một chuỗi cho hàm tạo ostringstream, nó chỉ tạo một bản sao của chuỗi đó ... –

+0

Vâng, tôi mong đợi điều đó. Tôi khuyên bạn nên tạo đối tượng stringbuf của riêng mình và đính kèm luồng vào đó. –

+0

Nếu bạn muốn vượt qua một bộ đệm trong sử dụng ostrstream không ostringstream – Mark

1

std::ostringsteam là giao diện tiện lợi. Nó liên kết một số std::string đến std::ostream bằng cách cung cấp tùy chỉnh std::streambuf. Bạn có thể thực hiện std :: streambuf của riêng bạn. Điều đó cho phép bạn quản lý toàn bộ bộ nhớ. Bạn vẫn nhận được định dạng đẹp của std::ostream, nhưng bạn có toàn quyền kiểm soát việc quản lý bộ nhớ. Tất nhiên, hậu quả là bạn nhận được kết quả được định dạng trong một số char[] - nhưng đó có lẽ không phải là vấn đề lớn nếu bạn là một nhà phát triển được nhúng.

+0

Hướng dẫn này hữu ích cho việc triển khai std tùy chỉnh :: streambuf http://www.mr-edd.co .uk/blog/beginners_guide_streambuf –

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