You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C程序中获取执行内存占用?无需struct timeval和microseg的实现

针对Project Euler第1题代码的内存获取方案(不使用struct timeval和microseg变量)

先明确一点:原代码里的计时逻辑(struct timeval、microseg和gettimeofday调用)和内存统计完全独立,所以我们可以直接剥离计时部分,保留getrusage的内存统计逻辑,或者替换计时方式但不使用禁止的变量。

最简修改版本(移除计时,保留内存统计)

#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>

int main(){
    int sum = 0;
    for (int k = 2; k < 1000; k++){
        if(k%3 == 0 || k%5 == 0) sum +=k;
    }
    printf("%d \n", sum);

    struct rusage uso;
    // 调用getrusage获取当前进程的资源使用情况
    if (getrusage(RUSAGE_SELF, &uso) == 0) {
        printf("Memory: %ld KB\n", (long)uso.ru_maxrss);
    } else {
        perror("Failed to retrieve resource usage");
        return EXIT_FAILURE;
    }

    return 0;
}

保留计时但不使用禁止变量的版本

如果你还想保留计时功能,不用struct timeval和microseg的话,可以改用clock()函数(统计CPU时间),示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <time.h>

int main(){
    clock_t start_clock = clock();
    
    int sum = 0;
    for (int k = 2; k < 1000; k++){
        if(k%3 == 0 || k%5 == 0) sum +=k;
    }
    printf("%d \n", sum);

    clock_t end_clock = clock();
    // 计算CPU时间,转换为秒
    double cpu_time_used = ((double)(end_clock - start_clock)) / CLOCKS_PER_SEC;
    printf("CPU time: %.6f seconds\n", cpu_time_used);

    struct rusage uso;
    if (getrusage(RUSAGE_SELF, &uso) == 0) {
        printf("Memory: %ld KB\n", (long)uso.ru_maxrss);
    } else {
        perror("Failed to retrieve resource usage");
        return EXIT_FAILURE;
    }

    return 0;
}

几个注意点

  • ru_maxrss的单位在不同系统有差异:Linux是KB,macOS是字节,要是需要跨平台,记得做单位转换。
  • getrusage是POSIX标准函数,在类Unix系统(Linux、macOS、BSD)都能用,Windows的话得换用GetProcessMemoryInfo这类API。

内容的提问来源于stack exchange,提问作者Zaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:17:47