如何对 nim 中的几行代码进行基准测试?
How to benchmark few lines of code in nim?
我从头到尾读了一遍:http://nim-lang.org/docs/times.html
但还是想不通简单的事情:如何两次获取以毫秒为单位的时间,一次在我的代码运行之前,一次在我的代码运行之后,然后打印差异?
我试过他们的例子:
var t0 = cpuTime()
sleep(300)
echo "CPU time [s] ", cpuTime() - t0
但这会打印一些无意义的东西:
CPU time [s] 4.200000000000005e-05
cpuTime
只计算 CPU 实际花费在进程上的时间,至少在 Linux 上是这样。所以整个睡眠时间不算在内。您可以改用 epochTime
,这是具有亚秒精度的实际 UNIX 时间戳。
如果您计划执行大量测量,最好的方法是创建一个可重复使用的辅助模板,抽象出计时代码:
import times, os, strutils
template benchmark(benchmarkName: string, code: untyped) =
block:
let t0 = epochTime()
code
let elapsed = epochTime() - t0
let elapsedStr = elapsed.formatFloat(format = ffDecimal, precision = 3)
echo "CPU Time [", benchmarkName, "] ", elapsedStr, "s"
benchmark "my benchmark":
sleep 300
这将打印出来
CPU Time [my benchmark] 0.305s
如果您需要有关项目中包含的所有代码的性能的更全面的数据,Nim 提供了一种特殊的构建模式,它使用分析探针检测编译后的代码。您可以在这里找到更多相关信息:
http://nim-lang.org/docs/estp.html
最后,由于 Nim 生成的 C 代码的 C 函数名称直接对应于它们的 Nim 对应项,因此您可以将任何 C 分析器与 Nim 程序一起使用。
我从头到尾读了一遍:http://nim-lang.org/docs/times.html
但还是想不通简单的事情:如何两次获取以毫秒为单位的时间,一次在我的代码运行之前,一次在我的代码运行之后,然后打印差异?
我试过他们的例子:
var t0 = cpuTime()
sleep(300)
echo "CPU time [s] ", cpuTime() - t0
但这会打印一些无意义的东西:
CPU time [s] 4.200000000000005e-05
cpuTime
只计算 CPU 实际花费在进程上的时间,至少在 Linux 上是这样。所以整个睡眠时间不算在内。您可以改用 epochTime
,这是具有亚秒精度的实际 UNIX 时间戳。
如果您计划执行大量测量,最好的方法是创建一个可重复使用的辅助模板,抽象出计时代码:
import times, os, strutils
template benchmark(benchmarkName: string, code: untyped) =
block:
let t0 = epochTime()
code
let elapsed = epochTime() - t0
let elapsedStr = elapsed.formatFloat(format = ffDecimal, precision = 3)
echo "CPU Time [", benchmarkName, "] ", elapsedStr, "s"
benchmark "my benchmark":
sleep 300
这将打印出来
CPU Time [my benchmark] 0.305s
如果您需要有关项目中包含的所有代码的性能的更全面的数据,Nim 提供了一种特殊的构建模式,它使用分析探针检测编译后的代码。您可以在这里找到更多相关信息:
http://nim-lang.org/docs/estp.html
最后,由于 Nim 生成的 C 代码的 C 函数名称直接对应于它们的 Nim 对应项,因此您可以将任何 C 分析器与 Nim 程序一起使用。