Racket中如何以微秒为单位测量函数执行时间且不输出结果
Racket 静默获取函数微秒级执行耗时的实现方法
你遇到的time表单默认打印返回值的问题,是DrRacket交互区的默认求值逻辑导致的:顶层的任何表达式求值结果都会被自动打印,time本身只是包裹表达式做计时,会把内部表达式的返回值原封不动透传出来,所以才会同时看到耗时和排序后的列表。
方案1:自定义计时函数(推荐,可直接获取微秒数值)
用Racket内置的高精度时间接口自己实现计时逻辑,主动丢弃函数返回值,直接返回微秒单位的耗时结果,全程不会产生多余打印:
;; 入参:待测量的单参数函数foo、传入参数n ;; 返回:整数类型的执行耗时,单位为微秒 (define (time-foo-us foo n) (define start-ms (current-inexact-milliseconds)) (void (foo n)) ; 调用函数后立刻丢弃返回值,不会触发打印 (define end-ms (current-inexact-milliseconds)) (exact-round (* (- end-ms start-ms) 1000))) ; 毫秒转微秒取整
调用时直接执行(time-foo-us foo n)即可,交互区只会返回耗时数值,不会输出foo的任何返回结果。
方案2:复用内置time表单(仅适合临时查看)
如果你只是不想看到函数返回值,不需要把耗时存为变量做后续处理,可以把time表达式的返回值传给void丢弃,就不会打印结果列表了:
(time (void (foo n)))
注意:这个写法只会在控制台输出类似
cpu time: 1234 real time: 1256 gc time: 12的耗时统计行,不会输出函数返回内容,但你无法直接捕获这里的耗时数值做批量统计。
测量注意事项
- 做耗时对比时建议重复运行3-5次取平均值,排除首次运行JIT编译、GC调度带来的偶然误差
- 计时逻辑内不要添加额外的打印、计算逻辑,避免把无关开销算入目标函数的执行时间
内容的提问来源于stack exchange,提问作者Awshaf Ishtiaque
相关产品推荐
相关产品推荐

