我有一些长达数百行的 Julia 函数,我想对其进行分析,以便我可以优化代码。
\n我知道BenchmarkTools@btime包允许使用或测量函数的整体执行时间和内存消耗@benchmark。但这些函数没有告诉我函数内部的瓶颈在哪里。因此,我的第一步必须使用某种工具来识别代码的哪些部分速度较慢。
例如,在 Matlab 中,有一个非常好的内置分析器,它运行脚本/函数,然后报告每行代码所花费的时间。类似地,Python 中有一个名为line_profiler的模块,它可以生成逐行报告,显示函数的每一行花费了多少时间。
\n我\xe2\x80\x99m 寻找的只是一个逐行报告,显示每行代码花费的总时间以及特定代码被调用的次数。
\nJulia 有这样的功能吗?内置或通过某些第三方包。
\nJulia 文档中有一个分析章节,其中包含所有必要的信息。
此外,您还可以使用ProfileView.jl或类似的包对分析代码进行可视化探索。
而且,不完全是分析,但在实践中非常有用的包是TimerOutputs.jl
UPD:由于 Julia 是一种编译语言,因此测量各行的时间是没有意义的,因为执行的实际代码可能与 Julia 中编写的代码有很大不同。
例如下面的 Julia 代码
function f()
x = 0
for i in 0:100_000_000
x += i
end
x
end
Run Code Online (Sandbox Code Playgroud)
降低至
julia> @code_llvm f()
; @ REPL[8]:1 within `f'
define i64 @julia_f_594() {
top:
; @ REPL[8]:7 within `f'
ret i64 5000000050000000
}
Run Code Online (Sandbox Code Playgroud)
即根本没有循环。这就是为什么使用一行在所有回溯集合中出现的频率的代理指标,而不是执行时间。当然,它与执行时间不同,但它很好地近似了瓶颈所在,因为执行时间长的行更频繁地出现在回溯中。