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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:40:30