我必须通过实验比较同一算法的两种不同实现的内存使用情况。这样做的正确方法是什么?我已经用C ++实现了这两个版本,并希望从linux的命令行中实现。
但是,我很困惑哪种方法可以准确地做到这一点?
答案 0 :(得分:2)
您可以像这样实施全球new
和delete
运算符:
#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);
}
这将捕获使用new
和delete
进行的任何分配。但是,它不会考虑使用的堆栈空间。如果需要考虑这一点(由于深度递归和/或大型局部变量),您必须使用不同的方法。但是,对于表现良好的代码,上述内容应该足够好。
请注意,您不需要对任何其他文件进行任何更改,只需链接这三个功能,即可获得输出。
答案 1 :(得分:0)
你可能喜欢gprof。它通常与类似构建必需的软件包一起安装,因此您可能已经拥有它。 Here是使用它的一些基本说明。
基本上,您必须重新链接您的程序,然后运行gprof。它将生成一个文本报告,您可以对所使用的每种算法进行比较。