2010-02-07 1 views
2

C++ 프로그램이나 C++ 프로그램에서 사용되는 메모리를 측정하는 가장 좋은 방법은 무엇입니까? 따라서 측정 코드는 코드의 일부가되어야하며 외부에서 측정해서는 안됩니다. 이 작업의 어려움을 알고 있으므로 100 % 정확할 필요는 없지만 최소한 메모리 사용에 대한 좋은 인상을 주어야합니다.C++로 블록이나 프로그램에 사용 된 메모리를 측정하는 방법

+0

프로파일 러를 사용하는 대신 측정 코드를 코드의 일부로 사용해야하는 이유는 무엇입니까? – JRL

+0

코드에 알고리즘이 있기 때문에 C++에서도 다른 사용자가 호출해야하며 메모리 사용 정보를 가져와야합니다. 지금은 런타임 만 측정되고 함수를 호출 한 후에 사용할 수 있습니다. 가장 좋은 경우 나는 지능형 생성자/해체 자 호출을 사용하여 C++ 블록의 메모리 사용량을 측정하려고합니다 (지금 ru-time 측정을 사용하고 있습니다). –

답변

2

테스트중인 코드에 직접 계측을 직접 추가하려는 경우가 아니면 블록 수준에서 측정하는 것이 어려울 것입니다 (기껏해야).

클래스 수준에서 newdelete의 오버로드로 시작하지 않으려 고합니다. 대신, ::operator new::operator delete의 오버로드를 사용합니다. 이것은 기본적으로 퍼널의 가장 중요한 부분입니다 (말하자면). 다른 모든 동적 메모리 관리는 결국 이들을 호출 (대부분은 매우 직접적으로 호출)하게됩니다. 따라서 일반적으로 프로그램 전체의 동적 메모리 사용량에 대해 알려주기 위해 가장 많은 노력을 기울일 것입니다.

주요 시간 당신이 그들이 별도의 풀을 관리하고, 그래서 이미 과부하 인 경우 것입니다 개인 클래스 newdelete의 오버로드를 처리해야하는 것, 그리고 당신이 얼마나 많은 관심을 풀이 지정된 시간에 사용 중입니다. 이 경우 주어진 간격 동안 메모리 사용량에 최고 수위 (water-mark)와 같은 것을 얻기 위해 계측을 직접 계측에 추가해야합니다.

+0

나는 이것에 관해 당신과 동의하고 그것에 대한 대답을 줄 생각을했다. 내가 보는 유일한 문제는 일부 코드가'malloc' 패밀리의 함수를 호출 할 수 있다는 것입니다. – Omnifarious

1

newdelete 연산자의 클래스 수준 재정의는 원하는 것입니다.

2

오버로드 newdelete은 아마도 갈 방법입니다. 특정 클래스뿐만 아니라 더 일반적 일 수도 있습니다. 그러나 newdelete이 만들어진 곳을 표시해야합니다. 그리고 어떤 종류의 시작/리셋 또는 표시 할 항목이 있으면이 블록을 입력하면 이제 블록을 종료합니다. 그리고 나서 역사가 일어난 후에 그것을 감시 할 수 있도록 역사를 유지할 필요가 있습니다.

+0

나는 또한 이것이 방법이라고 생각합니다. 문제는 외부 정적 링크 라이브러리에서 어떤 일이 일어나고 성능이 저하 될 것이라고 생각합니다. –

+0

올바른 경우 외부 라이브러리를 추적 할 수있는 메커니즘이 없다면 외부 라이브러리를 추적 할 수 없습니다. 그리고 성과가있을 것입니다. 우리가 시작/정지의 단일 스레드 낮은 사용을 말하는 경우 아마도 그렇게 크지는 않을 것입니다. – jpyllman

1

다른 사람들이 지적했듯이 새로운 힙을 오버로드하고 힙이 할당 된 양을 측정하기 위해 삭제할 수 있습니다. 스택에 대해 동일한 작업을 수행하려면 모험을 느끼면 몇 가지 ASM을 수행해야합니다. 스택 위치를 얻으려면 x86-64의 GCC에서 :

int64_t x = 0; 
asm("movq %%rsp, %0;" : "=r" (x)); 

이렇게하면 스택 포인터의 주소가 x가됩니다. 이것을 코드 주위 몇 군데에 넣고 블록 입력 전/후에 값을 비교하십시오.

컴파일러가 메모리를 할당하는 방법 /시기 때문에 원하는 결과를 얻으려면 약간의 작업이 필요할 수 있습니다. 그것은 소리처럼 직관적이거나 사소하지 않습니다.

관련 문제