2010-03-25 27 views
8

Tôi hiện đang đánh giá một vài bộ cấp phát bộ nhớ có thể mở rộng, cụ thể là nedmalloc và ptmalloc (được xây dựng trên dlmalloc), thay thế cho malloc/default mặc định do tranh chấp đáng kể trong môi trường đa luồng. Hiệu suất được công bố của họ có vẻ là tốt, tuy nhiên tôi muốn kiểm tra những gì là kinh nghiệm của những người khác đã thực sự sử dụng chúng.Kinh nghiệm cấp phát bộ nhớ mở rộng

  • Mục tiêu hiệu suất của bạn có hài lòng không?
  • Bạn có gặp phải bất kỳ sự cố không mong muốn hoặc khó giải quyết nào (như tham nhũng đống) không?
  • Nếu bạn đã thử cả ptmaalloc và nedmalloc, bạn sẽ giới thiệu hai loại nào trong hai loại này? Tại sao (dễ sử dụng, hiệu suất)?
  • Hoặc có lẽ bạn sẽ giới thiệu một người cấp phát có thể mở rộng khác (miễn phí với giấy phép được phép ưu tiên)?
+0

Bằng cách này bạn đã đánh giá trình phân bổ Hoard (http://www.hoard.org)? –

+2

Tôi không, bởi vì giấy phép GPL của nó không được chấp nhận trong trường hợp này (và giấy phép thương mại của nó có vẻ quá tốn kém đối với chúng tôi). – Suma

+0

Vì điều quan trọng đối với tôi, bạn có thể giải thích tại sao GPL không được chấp nhận? Điều gì làm cho nó không thể chấp nhận trong trường hợp của bạn? –

Trả lời

5

Tôi đã triển khai NedMalloc vào ứng dụng của mình và tôi khá hài lòng với kết quả. Sự tranh cãi mà tôi đã thấy trước đó đã biến mất, và người cấp phát khá dễ dàng cắm vào, ngay cả hiệu suất chung là rất tốt, đến mức chi phí của việc cấp phát bộ nhớ là ứng dụng hiện nay gần như không thể hiểu được.

Tôi đã không thử các ptmalloc, như tôi đã không tìm thấy một phiên bản Windows sẵn sàng của nó và tôi bị mất động lực một lần NedMalloc làm việc tốt cho tôi. Bên cạnh hai đề cập, tôi nghĩ rằng nó có thể cũng thú vị để thử TCMalloc - nó có một số tính năng tốt hơn sau đó NedMalloc trong lý thuyết (như rất ít chi phí cho phân bổ nhỏ, so với 4 B tiêu đề được sử dụng bởi NedMalloc) Tuy nhiên, dường như nó không có cổng Windows sẵn sàng, nó cũng có thể không dễ dàng.


Sau một vài tuần sử dụng NedMalloc, tôi bị buộc phải từ bỏ nó, vì chi phí không gian của nó đã được chứng minh là quá cao đối với chúng tôi. Điều đặc biệt của chúng tôi là NedMalloc dường như đang thu hồi lại bộ nhớ mà nó không còn được sử dụng cho hệ điều hành một cách tồi tệ, giữ hầu hết nó vẫn còn cam kết. Bây giờ tôi đã thay thế nó bằng JEMalloc, có vẻ không nhanh như vậy (nó vẫn nhanh, nhưng không nhanh bằng NedMalloc), nhưng nó rất mạnh mẽ theo cách này và khả năng mở rộng của nó cũng rất tốt.


Và sau một vài tháng sử dụng JEMalloc tôi đã chuyển sang TCMalloc.Phải mất nhiều công sức để thích ứng với Windows hơn so với những cái khác, nhưng kết quả của nó (cả hiệu suất và phân mảnh) dường như là tốt nhất cho chúng ta về những gì tôi đã thử nghiệm cho đến nay.

+0

Bạn có thể giải thích chi tiết về những thay đổi bạn đã thực hiện đối với TCmalloc không? Chúng tôi đang gặp vấn đề ngược lại, nơi mà TCmalloc trên Windows không trả lại bộ nhớ cho hệ thống đúng cách. (Trên Linux nó sử dụng madvise (MADV_DONTNEED) để trả về bộ nhớ vật lý, nhưng không có tương đương trên Windows.) Bạn giải quyết vấn đề này như thế nào? – skoy

+2

@skoy Bạn có thể tìm thấy nguồn của tất cả các nhà phân phối của chúng tôi tại http://community.bistudio.com/wiki/ArmA_2:_Custom_Memory_Allocator - phiên bản dựa trên TCMalloc có tại ftp://downloads.bistudio.com/arma2.com/update/ Allocs/TCMalloc_source.7z. Bạn có thể nhận thấy chúng tôi đã thay đổi TCMalloc_SystemAlloc và TCMalloc_SystemRelease khá nhiều. Lưu ý: Chúng tôi đã chuyển sang phân bổ Intel TBB trong khi đó, dựa trên hiệu suất quy mô lớn và kiểm tra độ ổn định. – Suma

+0

Cảm ơn bạn, điều đó cực kỳ hữu ích! – skoy

4

Trước đây tôi cần một phương pháp rất nhanh để cấp phát bộ nhớ. Tôi thấy rằng không có một phân bổ đã được vào công việc.

Sau một vài ngày tìm kiếm, tôi đã tăng cường :: hồ bơi, mà chúng tôi trong ứng dụng của chúng tôi đã tăng hiệu suất 300x.

Chúng tôi có ảnh hưởng đến việc chỉ gọi malloc/miễn phí trên các đối tượng mà chúng tôi muốn tạo. Mặc dù có một chút chi phí thiết lập, nhưng phải có một lượng lớn bộ nhớ để bắt đầu, nhưng một khi đã xong, điều này rất nhanh.

1

Tôi đã cố gắng để đi con đường của bạn một thời gian trước khi phải đối mặt với một tranh cãi đa luồng và một vấn đề phân mảnh nghiêm trọng. Sau khá nhiều thử nghiệm, tôi kết luận rằng lợi ích của những người cấp phát này là không đáng kể trong hầu hết các trường hợp thú vị mà tôi có.

Giải pháp thực sự là kéo trình quản lý bộ nhớ của riêng tôi, chuyên về các tác vụ tôi thường làm nhất.

1

Nếu bạn đang ở trên Win32 kinh nghiệm của tôi đã được rằng rất khó để đánh bại người quản lý heap Windows thường xuyên cung cấp cho bạn Heap phân mảnh thấp bằng cách sử dụng API HeapSetInformation. Tôi tin rằng đây là tiêu chuẩn hiện nay trên các phiên bản Windows mới hơn. Nó xử lý khóa bằng cách sử dụng Interlocked * Win32 nguyên thủy hơn là khóa Mutex/CritSec đơn giản hơn.

+0

Thật khó để đánh bại nó trong hiệu suất và phân đoạn đơn luồng, nhưng tiếc là nó không thể mở rộng đến nhiều lõi. Nó dường như bỏ lỡ "Chủ đề Caching" được cung cấp bởi phân bổ khả năng mở rộng khác, mà họ sử dụng để tránh khóa trong một tình huống điển hình hoàn toàn. – Suma

+0

Đủ công bằng. Nếu/khi bạn đã đo bằng cách sử dụng một số trong số đó, vui lòng cho tôi biết kết quả của bạn so với LFH tại đây. –

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