2017-03-14 1 views
1

동일한 알고리즘의 두 가지 구현의 메모리 사용을 실험적으로 비교해야합니다. 이 작업을 수행하는 올바른 방법은 무엇입니까? C++로 두 버전을 모두 구현했으며 리눅스의 명령 행에서이 작업을하고 싶습니다.메모리 사용 비교

하지만 정확히 어떻게 정확하게 수행 할 수 있는지 궁금합니다.

+0

[응용 프로그램 또는 프로세스의 실제 메모리 사용을 측정하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or- 프로세스) – Arash

+0

명령 터미널을 사용하는 간단한 방법은 "htop"명령을 사용하는 것입니다.이 명령은 컴퓨터에서 실행중인 프로세스를 표시 한 다음 프로그램 이름으로 이동하여 사용 된 RAM 양을 확인합니다 . –

답변

0

gprof를 좋아할 수도 있습니다. 흔히 빌드와 같은 필수 패키지와 함께 설치되기 때문에 이미 가지고있을 수 있습니다. Here은 기본 사용법입니다.

기본적으로 프로그램을 다시 링크 한 다음 gprof를 실행해야합니다. 사용하는 각 알고리즘에 대해 비교할 수있는 텍스트 보고서가 생성됩니다.

2

이 같은 글로벌 newdelete 연산자를 구현할 수 있습니다

#include <stdlib.h> 

static size_t curUsage = 0, maxUsage = 0; 
void* operator new (size_t size) { 
    curUsage += size; 
    if(maxUsage < curUsage) maxUsage = curUsage; 

    size_t* result = (size_t*)malloc(size + sizeof(size_t)); 
    *result = size; 
    return result + 1; 
} 
void operator delete (void *pointer) { 
    size_t* originalPtr = (size_t*)pointer - 1; 
    curUsage -= *originalPtr; 
    free(originalPtr); 
} 

당신이 gcc를 사용하는 가정 할 수 있습니다 후 출력 간단하게이 기능을 추가하여 실행의 끝 부분에있는 최대 메모리 사용량 :

#include <stdio.h> 
__attribute__ ((destructor)) void printMaxUsage() { 
    printf("max memory usage: %jd bytes\n", maxUsage); 
} 

이렇게하면 newdelete으로 이루어진 할당을 잡습니다. 그러나 사용 된 스택 공간을 고려하지 않습니다. 깊은 재귀 및/또는 큰 지역 변수로 인해이를 고려해야 할 경우 다른 접근 방식을 사용해야합니다. 그러나 잘 작동하는 코드의 경우 위의 코드가 충분해야합니다.

다른 파일을 변경할 필요가 없다는 점에 유의하십시오.이 세 가지 기능을 연결하면 출력물을 얻을 수 있습니다.

+0

유일한주의 사항은 스택을 측정하지 않기 때문에 수동으로 쉽게 추정 할 수있는 로컬 변수의 수에 따라 또는 알고리즘이 재귀적일 때 차이가 있습니다. – cbuchart

+1

@cbuchart 참. 'malloc()'에 의한 할당도 잡을 수 없다. 그럼에도 불구하고 스택 공간 사용에 대한 메모는 malloc() 호출보다 C++ 응용 프로그램에서 더 많이 사용되므로 스택 공간 문제에 대한 메모를 추가했습니다. 당신이 그것을 좋아하길 바란다 :-) – cmaster

+0

invasive (그리고 많은 함수가 없다면) 아마도 (각 함수의 맨 처음에 생성 된) 로컬 객체 (현재 스택 위치)에서 자체 주소를 취하고 그 차이를 계산한다. (로컬 변수의 주소를 사용하여) 파괴에 관해서 ... 글쎄, 아이디어를 초안하기 위해서 메모리 정렬이 고려 될 수있는 이점이있다. – cbuchart