如何强制优化器在 Julia 中保留一些代码?

Mii*_*iao 5 benchmarking microbenchmark julia

如何强制计算表达式,使其不会被优化?

@elapsed f()返回零,因为纯函数的结果f未被使用。

在 Rust 中,我们可以使用一个名为 的内在函数black_box,在 Nim - usedpragma 中,在 C 中我们可以创建一个volatile变量,在 Zig -doNotOptimizeAway函数中,在 Haskell 中我们可以使用它evaluate来强制求值,等等。我怎样才能在朱莉娅做到这一点?


另外,@elapsed实际上是测量经过时间的正确方法吗?我个人需要一个具有纳秒精度的单调计时器......

Aug*_*ust 5

如果您还没有看到过,BenchmarkTools.jl可能就是您正在寻找的。

Base.donotdelete将阻止死代码消除(但不会停止f()优化为常量,如果可能的话)。

f() = maximum(i^2 for i = 1:1000000000)

timeit1() = @elapsed f()
timeit2() = @elapsed Base.donotdelete(f())

timeit1() # 0.0
timeit2() # 0.36 ish
Run Code Online (Sandbox Code Playgroud)

@elapsed使用Base.time_ns(),因此具有纳秒精度。