【问题标题】:Memory Usage Comparison内存使用比较
【发布时间】:2017-08-05 04:57:14
【问题描述】:

我必须通过实验比较同一算法的两种不同实现的内存使用情况。这样做的正确方法是什么?我已经用 C++ 实现了这两个版本,并且想从 linux 的命令行中实现。

但是,我不知道哪种方法最准确?

【问题讨论】:

标签: c++ linux c++11 memory memory-management


【解决方案1】:

您可以像这样实现全局 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 进行的任何分配。但是,它不会考虑使用的堆栈空间。如果您需要考虑到这一点(由于深度递归和/或较大的局部变量),您必须使用不同的方法。但是,对于表现良好的代码,以上内容应该已经足够了。

请注意,您不需要对任何其他文件进行任何更改,只需将这三个函数链接起来,即可获得输出。

【讨论】:

  • 唯一需要注意的是,这不会测量堆栈,所以你会有差异取决于你有多少局部变量(可以很容易地手动估计),或者如果你的算法是递归的.
  • @cbuchart 是的。它也不会捕获malloc() 所做的分配。尽管如此,我现在添加了关于堆栈空间问题的注释,因为堆栈空间的使用在 C++ 应用程序中比 malloc() 调用更常见。希望你喜欢:-)
  • 虽然侵入性(如果没有很多函数)可能使用本地对象(在每个函数的开头创建),它在创建时采用自己的地址(当前堆栈位置)并计算差异关于销毁(使用局部变量的地址)...好吧,只是为了起草一个想法,它的优点是会考虑内存对齐,手动计数更困难。
  • @cbuchart 是的,我自己也想过同样的方向,但认为不值得在答案中详细说明它,因为在大多数情况下可能不值得努力实现它.如果我需要采用这种方法,我会使用一个小函数,它获取单个 char 局部变量的地址并将其与 main() 中的另一个 char 变量地址进行比较。这样做的好处是在报告图中包含了当前函数的堆栈帧,而插入变量方法将其省略了。
【解决方案2】:

您可能喜欢 gprof。它通常与 build-essential-like 软件包一起安装,因此您可能已经拥有它。 Here 是一些基本的使用说明。

基本上,您必须重新链接您的程序,然后运行 ​​gprof。它会生成一个文本报告,您可以对使用的每种算法进行比较。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2013-12-26
    • 2016-11-14
    • 1970-01-01
    • 2023-03-07
    • 2011-07-15
    相关资源
    最近更新 更多