可以对 Julia 代码进行逐行分析吗?

Pet*_*nks 6 julia

我有一些长达数百行的 Julia 函数,我想对其进行分析,以便我可以优化代码。

\n

我知道BenchmarkTools@btime包允许使用或测量函数的整体执行时间和内存消耗@benchmark。但这些函数没有告诉我函数内部的瓶颈在哪里。因此,我的第一步必须使用某种工具来识别代码的哪些部分速度较慢。

\n

例如,在 Matlab 中,有一个非常好的内置分析器,它运行脚本/函数,然后报告每行代码所花费的时间。类似地,Python 中有一个名为line_profiler的模块,它可以生成逐行报告,显示函数的每一行花费了多少时间。

\n

我\xe2\x80\x99m 寻找的只是一个逐行报告,显示每行代码花费的总时间以及特定代码被调用的次数。

\n

Julia 有这样的功能吗?内置或通过某些第三方包。

\n

And*_*kin 5

Julia 文档中有一个分析章节,其中包含所有必要的信息。

此外,您还可以使用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)

即根本没有循环。这就是为什么使用一行在所有回溯集合中出现的频率的代理指标,而不是执行时间。当然,它与执行时间不同,但它很好地近似了瓶颈所在,因为执行时间长的行更频繁地出现在回溯中。