2013-08-22 59 views
5

Tôi đã có một chương trình C++ đáng chú ý là chậm hơn trên OSX 10.8.2 so với trên Linux. Profiling cho thấy rằng lý do là các cuộc gọi đến miễn phí (kết quả từ các hoạt động STL, FWIW), chậm hơn nhiều trên OSX, bởi vì chúng đi và gọi madvise, và thời gian thực được tiêu thụ trong đó.Khi nào thư viện 'miễn phí' của MacOSX gọi madvise, và có cách nào để kiểm soát nó không?

Có cách nào để điều chỉnh hành vi này của OS/X không?

Trả lời

2

Vâng, vâng!

Tôi gặp vấn đề về hiệu suất khủng khiếp với tính năng malloc/miễn phí trong Linux và bắt đầu tìm kiếm sự thay thế. Hai tùy chọn đến với tâm trí tbbmalloc (một phần của TBB của Intel là BTW miễn phí) và Google malloc. Sau khi thử nghiệm rộng rãi, nó không rõ ràng là nhanh hơn (của hai) nhưng cả hai đều nhanh hơn đáng kể so với triển khai của LIBC.

Tôi đã sử dụng tbbmalloc vì nó hoạt động mượt mà hơn, google malloc có lỗi khiến bộ nhớ ảo rất lớn (được bảo lưu nhưng không cam kết) rất xấu cho ứng dụng của tôi (trình nền CNTT sẽ giết nó).

Ưu điểm:

  • Tốt hơn nhiều hiệu suất hơn malloc libc của. Đã được 3x-300x trong ứng dụng nặng STL.
  • Tích hợp đơn giản. Không có thay đổi mã. Thêm/thay đổi 1 dòng makefile của tập tin thực thi. Không có thay đổi đối với SO.

Nhược điểm:

  • cờ Mem sẽ không có thay thế. cho memchk/valgrind/etc. quay trở lại malloc gốc.
  • Ứng dụng sẽ mất thêm 10-30% bộ nhớ.

Ứng dụng tôi phát triển là ứng dụng CAD sử dụng 10 GB, xây dựng và phá hủy 10 trong số hàng triệu cấu trúc khác nhau (nhiều bản đồ STL, vectơ, hash_maps).

Làm thế nào để làm điều này:

Trong lệnh mối liên kết, thêm -ltbbmalloc và chắc chắn rằng thư viện là trong con đường tìm kiếm lib (-L cờ).