2009-10-05 6 views
7

지난 며칠 동안 표준 malloc() 이외의 메모리 할당 자에 대한 정보를 얻었습니다. 스레드가 많은 응용 프로그램의 경우에는 malloc()보다 훨씬 나은 구현이 일부 있습니다. 예를 들어, tcmallocptmalloc이 더 나은 성능을 갖는 것으로 보입니다.기존 코드에서 새 메모리 할당자를 대체하는 가장 좋은 해결책은 무엇입니까?

저는 많은 곳에서 mallocnew 연산자를 모두 사용하는 C++ 응용 프로그램을 가지고 있습니다. ptmalloc과 같은 것으로 바꾸면 성능이 향상 될 수 있습니다. 그러나 나는 리눅스에서 실행되는 C++ 응용 프로그램에서 사용될 때 new 연산자가 어떻게 작동하는지 궁금합니다. malloc 또는 다른 표준 동작을 사용합니까?

new 메모리 할당자를 이전 코드로 대체하는 가장 좋은 방법은 무엇입니까? 행동을 재정의하는 방법이 있습니까? 아니면 newmalloc입니까? 아니면 모든 통화를 하나씩 바꾸어야합니까?

+0

프로그램이 메모리 관리에 많은 시간을 소비한다고 판단 했습니까? – rpg

+0

네, 맞습니다. 나는 이미 그것에 대해 확신했습니다. –

답변

2

:

는 TCmalloc을 사용하려면, 그냥 "-ltcmalloc"링커 플래그를 통해 응용 프로그램에 tcmalloc을 연결합니다. 당신은 당신이 LD_PRELOAD 사용하여 자신을 컴파일되지 않은 응용 프로그램에서 tcmalloc을 사용할 수 있습니다 : =

$의 LD_PRELOAD을 "는/usr/lib 디렉토리/libtcmalloc.so"

ptmalloc이라 비슷한 것 같다 (하지만 경우 Linux에서 이미 사용하고있을 가능성이 높습니다. because it's part of the GNU C library).

나는 malloc 전화 operator new을 기대하지만, 당신은 쉽게 다음, malloc에 중단 점을 설정 new를 호출하여 직접 확인할 수 있습니다. newmalloc을 호출하지 않으면 you can redefine it so that it does입니다.

+1

당신이 말한 부분을 건너 뛰었습니다 : LD_PRELOAD는 까다 롭고, 우리는 반드시이 사용 모드를 권장하지 않습니다. – rpg

+0

맞습니다, 제가 그랬습니다. 왜냐하면 필자는 본질적인 것보다 더 많은 것을 인용하고 싶지 않았기 때문입니다. 자세한 문서는 링크 뒤에 있습니다. –

0

오버 라이딩이 가능하다고 생각합니다. 당신은 당신이 원하는 새로운 구현 라이브러리로 당신의 어플리케이션을 링크시킬 수 있으며, 새로운 malloc에 ​​대한 모든 호출은 오버라이드 될 것이다. 나는 그렇게하지 않았다. 하지만 valgrind를 사용할 때 자체 메모리 할당자를 사용하여 응용 프로그램의 메모리 사용 통계를 추적하고 결국 결과를 생성하기 때문에 가능하다고 추측합니다. 그렇게 할 수 있다면 분명히 방법이 있어야합니다.

확인하십시오. link 비슷한 종류의 스마트 힙 라이브러리에 대한 정보가 포함되어 있습니다! TCMalloc documentation에서

1

프로그램이 멀티 스레드 인 경우 Hoard 할당자가 높게 평가됩니다. 필자는 개인적으로 glibc의 ptmalloc이 이미 꽤 좋기 때문에 Linux에서 신경 쓸 필요가 없다고 생각합니다.

+0

내가 말하는 코드는 너무 많은 새로운 malloc 호출을 사용합니다. ptmalloc은 코드가 Linux 용으로 컴파일 될 때 실제로 호출됩니다. –

+1

예, Linux에서 작업하는 경우 이미 ptmalloc을 사용하고 있습니다. –

0

앱이 메모리 할당에 소비하는 시간은 얼마나됩니까?

관련 문제