如何在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
相关产品推荐
相关产品推荐

