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 malloc
và free
(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.
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. –
Bạn đã biên dịch với tối ưu hóa đã bật chưa? -O3 –
Windows 7x64. Biên dịch theo Visual Studio 2010. Có cách nào để tăng tốc độ deallocation lên? –