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

How to force the optimizer to keep some code in Julia?

提问人:Miiao 提问时间:6/18/2023 最后编辑:Peter CordesMiiao 更新时间:6/19/2023 访问量:74

问:

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

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

在 Rust 中,我们可以使用一个名为 的内在函数,在 Nim 中 - 编译指示,在 C 中我们可以创建一个变量,在 Zig 中 - 函数,在 Haskell 中,我们可以用来强制计算,等等。我怎样才能在朱莉娅做到这一点?black_boxusedvolatiledoNotOptimizeAwayevaluate


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

Julia 测试微基准

评论


答:

5赞 August 6/19/2023 #1

如果您还没有看过它,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

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

评论

0赞 Miiao 6/19/2023
谢谢,两者都完美无缺donotdeletetime_ns