为何不同命令行调用Deno时执行耗时差异巨大?
我正在进行如下基准测试:
likwid-powermeter deno run scripts/sets.deno.js 1024
返回结果:
Runtime: 2.99816 s Measure for socket 0 on CPU 0 Domain CORE: Energy consumed: 39.3306 Joules Power consumed: 13.1182 Watt Domain PKG: Energy consumed: 139.635 Joules Power consumed: 46.5737 Watt
但使用理论等效的绝对路径命令时,耗时是前者的8倍:
likwid-powermeter `which deno` run scripts/sets.deno.js 1024
返回结果:
Runtime: 17.4637 s Measure for socket 0 on CPU 0 Domain CORE: Energy consumed: 312.243 Joules Power consumed: 17.8795 Watt Domain PKG: Energy consumed: 910.834 Joules Power consumed: 52.1557 Watt
已通过time命令排查,问题并非出在Deno本身;其他运行时或命令未出现此问题。请问可能的原因是什么,或应从何处入手排查?
likwid-powermeter的进程追踪逻辑差异:likwid对通过PATH查找的命令和绝对路径命令的进程附着机制可能不同。直接用
deno时,likwid能准确追踪目标进程;而用绝对路径时,可能因shell替换时机问题,likwid误追踪了shell父进程,或未正确附着到Deno子进程,导致CPU调度/亲和性异常,拖慢执行。可以用ps或pstree在测试过程中查看likwid追踪的进程ID,确认是否正确绑定到Deno。Deno的路径相关缓存机制:Deno会基于调用路径区分缓存(如字节码缓存、模块缓存)。使用绝对路径调用时,可能触发全新的缓存生成流程,而非复用
deno命令名对应的缓存,导致重复编译、初始化操作。可以检查$DENO_DIR下的缓存目录,对比两种调用方式生成的缓存文件数量、大小差异。进程启动时的环境与参数差异:用反引号执行
which deno会改变进程的argv[0](从deno变为绝对路径),同时可能影响PWD等环境变量。Deno可能根据argv[0]加载不同的配置或触发特殊初始化逻辑。可以用strace对比两种启动方式的系统调用,看是否存在额外的文件读取、环境变量处理步骤:strace -c likwid-powermeter deno run scripts/sets.deno.js 1024 strace -c likwid-powermeter `which deno` run scripts/sets.deno.js 1024CPU亲和性绑定失效:likwid默认会将目标进程绑定到特定CPU核心(如测试中的CPU 0)。使用绝对路径时,可能likwid的绑定逻辑未生效,导致Deno进程在多核心间切换,增加调度开销。可以手动用
taskset指定核心后对比测试:likwid-powermeter taskset -c 0 deno run scripts/sets.deno.js 1024 likwid-powermeter taskset -c 0 `which deno` run scripts/sets.deno.js 1024likwid版本或配置问题:不同版本的likwid对进程追踪的处理存在差异,本地
likwid.cfg配置也可能对绝对路径进程有特殊规则。可以尝试更新likwid到最新版本,或重置配置后重新测试。
内容的提问来源于stack exchange,提问作者jjmerelo

