2009-05-13 23 views
22

Chương trình C++ sử dụng một số tệp DLL và QT phải được trang bị thay thế malloc (như tcmalloc) cho các vấn đề hiệu suất có thể được xác minh là do Windows malloc gây ra. Với Linux, không có vấn đề, nhưng với các cửa sổ, có một số phương pháp tiếp cận, và tôi thấy không ai trong số họ hấp dẫn:Thay thế malloc Windows (ví dụ, tcmalloc) và crt động liên kết

1. Đặt malloc mới trong lib và hãy chắc chắn để liên kết nó đầu tiên (Other SO-question)

Điều này có bất lợi, ví dụ: strdup will still use the old malloc and a free may crash the program.

2. Remove malloc từ thư viện libcrt tĩnh với lib.exe (Chrome)

này được kiểm tra/sử dụng (?) Cho chrome/chromium, nhưng có những bất lợi mà nó chỉ làm việc với tĩnh nối crt . Liên kết tĩnh có vấn đề nếu một thư viện hệ thống được liên kết động với msvcrt có thể là mismatches in the heap allocation/deallocation. Nếu tôi hiểu nó một cách chính xác, tcmalloc có thể được liên kết động như vậy mà có một đống phổ biến cho tất cả các dlls tự biên dịch (đó là tốt).

3. patch đang crt nguồn (firefox)

Firefox's jemalloc rõ ràng vá mã nguồn cửa sổ CRT và xây dựng một crt mới. Điều này lại có vấn đề liên kết tĩnh/động ở trên.

Người ta có thể nghĩ đến việc sử dụng điều này để tạo MSVCRT động, nhưng tôi nghĩ điều này là không thể, bởi vì giấy phép cấm cung cấp MSVCRT được vá có cùng tên.

4. Tự động vá CRT được nạp vào thời gian chạy

Một số allocators bộ nhớ hàng thương mại có thể làm ảo thuật như vậy. tcmalloc cũng có thể làm, nhưng điều này có vẻ khá xấu xí. Nó có một số vấn đề, nhưng chúng đã được sửa. Hiện tại, với tcmalloc nó không hoạt động trong các cửa sổ 64 bit.

Có phương pháp tiếp cận tốt hơn không? Có ý kiến ​​gì không?

+1

Bạn đã sử dụng phương pháp tiếp cận nào? Mà một trong những bạn đã sử dụng để xác minh khẳng định rằng các cấp phát thay thế làm việc tốt hơn so với một được cung cấp với malloc CRT? Bạn đã sử dụng phiên bản CRT nào và nó có tốt hơn/xấu hơn/giống như phiên bản mới hơn không? –

+0

Tại sao không thử thay thế toàn cầu C++ mới? Sẽ không làm việc (và phù hợp với libs + ứng dụng chia sẻ chính nhị phân + ms crt như là một thiết lập lib chia sẻ)? – mlvljr

Trả lời

1

Tiền đề của bạn ở đâu "Chương trình A C++ sử dụng một số tệp DLL và QT phải được trang bị một thay thế malloc" đến từ đâu?

Trên Windows, nếu tất cả các dll sử dụng MSVCRT được chia sẻ, thì không cần phải thay thế malloc. Theo mặc định, Qt xây dựng dựa trên dll MSVCRT được chia sẻ.

Một sẽ chạy vào các vấn đề nếu họ:

1) trộn dlls rằng sử dụng liên kết tĩnh vs sử dụng VCRT chia sẻ bộ nhớ

2) cũng miễn phí mà không được phân bổ nó đến từ đâu (tức là, bộ nhớ trống trong một dll được liên kết tĩnh được phân bổ bởi VCRT được chia sẻ hoặc ngược lại). Lưu ý rằng việc thêm trình bao bọc tính ref của riêng bạn xung quanh tài nguyên có thể giúp giảm thiểu các vấn đề liên quan đến tài nguyên cần được giải quyết theo các cách cụ thể (nghĩa là trình bao bọc một loại tài nguyên thông qua một cuộc gọi trở lại nguồn gốc). dll, một trình bao bọc khác cho một tài nguyên có nguồn gốc từ một dll khác, v.v.).

+4

Tiền đề xuất phát từ hiệu suất lớn khi sử dụng tcmalloc thay cho MSVCRT. – Weidenrinde

+1

Nếu đó là trường hợp, sau đó một chương trình C hoặc thậm chí một chương trình C++ mà không sử dụng Qt có thể hưởng lợi từ sự thay đổi. Tuy nhiên, tôi sẽ không đồng ý rằng họ "nên được trang bị một thay thế malloc" cho đến khi hồ sơ chỉ ra rằng MSVCRT là không đủ. –

+2

1. Các cải tiến hiệu suất lớn được đo lường rõ ràng liên quan đến quản lý bộ nhớ của MSVCRT. Tác động phụ thuộc vào phong cách phân bổ của chương trình, do đó tôi không tuyên bố rằng MSVCRT là xấu. 2. Tôi vừa đề cập đến Qt để chỉ ra rằng một số ứng dụng con sử dụng QT-lib và do đó liên kết tĩnh không phải là tùy chọn ưa thích. – Weidenrinde

8

Q: Một chương trình C++ được chia thành nhiều dll nên:

A) thay thế malloc?

B) đảm bảo phân bổ và phân bổ không xảy ra trong cùng một mô đun dll? A2: Câu trả lời đúng là B. Một thiết kế ứng dụng C++ kết hợp nhiều DLL NÊN đảm bảo rằng một cơ chế tồn tại để đảm bảo rằng mọi thứ được phân bổ trên heap trong một dll, được tự do bởi cùng một mô-đun dll.


Tại sao bạn sẽ chia một chương trình C++ thành nhiều dlls không? Chương trình C++ có nghĩa là các đối tượng và kiểu bạn đang xử lý là các mẫu C++, đối tượng STL, các lớp, vv Bạn không thể truyền các đối tượng C++ qua các đường liên kết dll mà không cần thiết kế rất cẩn thận và nhiều phép thuật cụ thể của trình biên dịch. từ việc sao chép lớn mã đối tượng trong các dll khác nhau, và kết quả là một ứng dụng cực kỳ nhạy cảm với phiên bản. Bất kỳ thay đổi nhỏ nào đối với định nghĩa lớp sẽ buộc xây dựng lại tất cả các exe và dll's, loại bỏ ít nhất một trong những lợi ích chính của một cách tiếp cận dll để phát triển ứng dụng.

Hoặc dính vào giao diện C thẳng giữa ứng dụng và dll, bị địa ngục hoặc chỉ biên dịch toàn bộ ứng dụng C++ thành một exe.

1

nedmalloc? cũng NB rằng smplayer sử dụng một bản vá đặc biệt để ghi đè malloc, có thể là hướng bạn đang hướng đến.

+0

Bạn có biết, làm thế nào nedmalloc xử lý vấn đề? – Weidenrinde

+0

không chắc chắn, mặc dù tôi biết điều đó "không tự động thay thế hệ thống malloc()" http://www.nedprod.com/programs/portable/nedmalloc/ có thể có nhiều hơn – rogerdpack

+0

Trong mã nguồn nedmalloc, có một trình thu thập thông tin . Có vẻ như nó đang làm phép thuật (4), và đó có lẽ là điều bạn muốn. Chưa kiểm tra, nếu cửa sổ x64 được hỗ trợ. – zerm

5

Đó là một tuyên bố rõ ràng rằng một chương trình C++ "nên được trang bị với một thay thế malloc (như tcmalloc) cho vấn đề hiệu suất .... "

" [In] 6 trong số 8 điểm chuẩn phổ biến ... [ứng dụng có kích thước thực] thay thế bộ phân bổ tùy chỉnh, trong đó mọi người đã đầu tư một lượng đáng kể thời gian và tiền bạc, .. Với hệ thống cấp phát câm do hệ thống cung cấp [năng suất] hiệu suất tốt hơn. ... Các trình phân bổ tùy chỉnh đơn giản nhất, được điều chỉnh cho các tình huống rất đặc biệt, là những người duy nhất có thể mang lại lợi ích. " - Andrei Alexandrescu

Hầu hết các nhà phân phối hệ thống đều tốt bằng cách phân bổ mục đích chung. Bạn chỉ có thể làm tốt hơn chỉ nếu bạn có mẫu phân bổ rất cụ thể. Thông thường, các mẫu đặc biệt này chỉ áp dụng cho một phần của chương trình, trong trường hợp đó, tốt hơn nên áp dụng công cụ phân bổ tùy chỉnh cho phần cụ thể có thể có lợi hơn là thay thế toàn bộ trình phân bổ.

C++ cung cấp một số cách để thay thế có chọn lọc trình phân bổ. Ví dụ, bạn có thể cung cấp một bộ cấp phát cho một thùng chứa STL hoặc bạn có thể ghi đè lên mới và xóa trên một lớp theo cơ sở lớp. Cả hai điều này cung cấp cho bạn khả năng kiểm soát tốt hơn nhiều so với bất kỳ hack nào trên toàn cầu thay thế trình cấp phát.

Cũng lưu ý rằng thay thế malloc và miễn phí sẽ không nhất thiết phải thay đổi trình phân bổ được sử dụng bởi toán tử mới và xóa. Trong khi toán tử mới toàn cục thường được thực hiện bằng cách sử dụng malloc, thì không yêu cầu nó làm như vậy. Vì vậy, thay thế malloc có thể thậm chí không ảnh hưởng đến hầu hết các phân bổ.

Nếu bạn đang sử dụng C, rất có thể bạn có thể gói hoặc thay thế phím malloc và cuộc gọi miễn phí bằng công cụ phân bổ tùy chỉnh của bạn. (Nếu đó không phải là trường hợp, bạn có thể muốn xem xét một số tái cấu trúc.)

Nhà phân phối hệ thống có nhiều thập kỷ phát triển đằng sau chúng. Chúng ổn định và được thử nghiệm tốt. Họ thực hiện rất tốt cho các trường hợp chung (về tốc độ thô, tranh chấp sợi và phân mảnh). Họ có các phiên bản gỡ lỗi để phát hiện rò rỉ và hỗ trợ cho các công cụ theo dõi. Một số thậm chí còn cải thiện tính bảo mật của ứng dụng của bạn bằng cách cung cấp khả năng bảo vệ chống lại các lỗ hổng tràn bộ đệm heap. Rất có thể, các thư viện bạn muốn sử dụng đã được kiểm tra chỉ với bộ cấp phát hệ thống.

Hầu hết các kỹ thuật để thay thế người cấp phát hệ thống sẽ mất các lợi ích này. Trong một số trường hợp, chúng thậm chí có thể tăng nhu cầu bộ nhớ (vì chúng không thể được chia sẻ với thời gian chạy DLL có thể được sử dụng bởi các quy trình khác). Họ cũng có xu hướng cực kỳ mong manh khi đối mặt với những thay đổi trong phiên bản trình biên dịch, phiên bản thời gian chạy và thậm chí là phiên bản hệ điều hành. Sử dụng phiên bản tinh chỉnh của thời gian chạy ngăn người dùng của bạn nhận được lợi ích của các bản cập nhật thời gian chạy từ nhà cung cấp hệ điều hành. Tại sao cho tất cả những gì lên khi bạn có thể giữ lại những lợi ích bằng cách áp dụng một cấp phát tùy chỉnh chỉ để phần đặc biệt của chương trình có thể được hưởng lợi từ nó?

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