如何在Linux上高效测量g++多线程编译时间?
可靠的C++编译时间测量替代方案
针对你遇到的问题,这里有几个实用方案,既能避开time命令的局限性,也不用停止使用电脑:
用
perf stat统计CPU时间总和
这个工具能精准统计进程(包括多线程子进程)的CPU消耗,还支持重复运行取平均值,抵消其他任务的干扰。比如编译时执行:perf stat -r 3 make -j$(nproc)-r 3表示重复运行3次,最终输出的user+sys时间总和是所有CPU核心的耗时累加,能反映编译实际的CPU工作量,多次平均后误差很小,不受其他任务抢占的影响。利用ninja的内置统计功能
如果你的项目用ninja构建,直接用ninja -t stats就能生成详细的编译时间报告,里面会区分每个编译目标的耗时,以及总CPU时间、墙钟时间。ninja会自动跟踪所有子进程的时间,统计结果更贴合编译本身的工作量,多次运行后取平均能进一步减少其他任务的干扰。写简单脚本跟踪编译进程的CPU时间
用shell脚本配合wait和getrusage,可以单独统计编译进程及其所有子进程的CPU时间。比如:#!/bin/bash make -j$(nproc) & PID=$! wait $PID RUSAGE=$(getrusage -p $PID) echo "User CPU time: $(echo $RUSAGE | grep -o 'ru_utime [0-9]*\.[0-9]*' | cut -d' ' -f2)" echo "Sys CPU time: $(echo $RUSAGE | grep -o 'ru_stime [0-9]*\.[0-9]*' | cut -d' ' -f2)" echo "Total CPU time: $(echo "$(echo $RUSAGE | grep -o 'ru_utime [0-9]*\.[0-9]*' | cut -d' ' -f2) + $(echo $RUSAGE | grep -o 'ru_stime [0-9]*\.[0-9]*' | cut -d' ' -f2)" | bc)"这个脚本会等待编译完成后,输出该进程组的用户态和内核态CPU时间总和,这个值不受其他任务的影响,统计的是编译进程实际占用CPU的时间。
多次运行取平均值
不管用哪种工具,多次运行编译任务后取real时间的平均值,都能大幅降低其他任务干扰带来的误差。比如运行5次time make,去掉最大值和最小值后取中间3次的平均值,结果会相对准确。
内容的提问来源于stack exchange,提问作者Autechre
相关产品推荐
相关产品推荐

