2011-11-25 32 views
6

Tôi có một câu hỏi mà tôi không thể tìm thấy câu trả lời trên mạng ...Tại sao deallocation lại chậm?

Tôi đã một tập tuyên bố như thế này:

set<unsigned int> MySet 

Tôi chèn một triệu số ngẫu nhiên được tạo ra với Mersenne twister . Việc tạo và chèn ngẫu nhiên thực sự nhanh (khoảng một giây cho một triệu số), nhưng deallocation cực kỳ chậm (1 và một nửa phút).

Tại sao giao dịch lại quá chậm? Tôi không sử dụng bất kỳ destructors tùy chỉnh cho các thiết lập.

+0

Tôi không biết bạn đang sử dụng Op Sys nhưng có thể bộ nhớ đang được nén lại sau mỗi đoạn được giải phóng. –

+2

Bạn đã biên dịch với tối ưu hóa đã bật chưa? -O3 –

+0

Windows 7x64. Biên dịch theo Visual Studio 2010. Có cách nào để tăng tốc độ deallocation lên? –

Trả lời

7

Biên dịch mã của bạn ở chế độ phát hành.

Điều này có hai điều.

  1. Nó bật tối ưu hóa giúp đỡ chắc chắn.
  2. Các thư viện quản lý bộ nhớ khác nhau để gỡ lỗi và phát hành.
    Phiên bản gỡ lỗi của thư viện được xây dựng để cho phép gỡ lỗi và chúng duy trì thêm thông tin (như đánh dấu bộ nhớ không phân bổ). Tất cả quá trình xử lý bổ sung này thực sự mất phí
    • Mục tiêu của hai phiên bản thư viện là hoàn toàn khác nhau. Phiên bản phát hành chắc chắn được tối ưu hóa cho tốc độ phiên bản gỡ lỗi được tối ưu hóa để phục hồi và gỡ lỗi.

Lưu ý thông tin này là về DevStudio.

1

Có lẽ vì nó có ý nghĩa hơn để tối ưu hóa phân bổ tại chi phí của deallocation, bởi vì nhiều ứng dụng phân bổ mà không deallocating, nhưng không bao giờ ngược lại. Tôi đã nhìn thấy một mô hình tương tự như bản thân mình, trong một ứng dụng trộn lẫn các cuộc gọi đến mallocfree (trái ngược với phân bổ và deallocating tất cả cùng một lúc).

Tôi chưa bao giờ viết trình phân bổ heap, vì vậy tôi không biết liệu có lý do kỹ thuật sâu hơn không. Khi deallocating, khối liền kề miễn phí phải được tìm thấy và coalesced. Vì vậy, công việc chỉ khác biệt về cơ bản.

90 giây cho 1 triệu âm thanh nhỏ của free() khá chậm. Tôi chưa bao giờ thực sự lập trình Windows vì vậy tôi không thể nói nếu đó là bất thường, nhưng hệ thống sẽ có thể làm tốt hơn nhiều.

Giải pháp cho vấn đề của bạn có thể đơn giản là bỏ qua việc giải phóng các đối tượng trước khi thoát khỏi chương trình. Bạn có thể thử phát sinh một trình phân bổ tùy chỉnh từ std::allocator< unsigned int > làm cho số deallocate không hoạt động.

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