julia - 可以逐行分析 Julia 代码吗?

标签 julia

我有一些长达数百行的 Julia 函数,我想对其进行分析,以便我可以优化代码。
我知道 BenchmarkTools 包允许使用 @btime 测量函数的整体执行时间和内存消耗。或 @benchmark .但是这些函数并没有告诉我瓶颈在函数内部的什么位置。所以我的第一步必须是使用一些工具来识别代码的哪些部分很慢。
例如,在 Matlab 中有一个非常好的内置分析器,它运行一个脚本/函数,然后报告每一行代码所花费的时间。类似地,在 Python 中有一个名为 line_profiler 的模块,它可以生成逐行报告,显示函数的每一行花费了多少时间。
我正在寻找的只是一份逐行报告,显示每行代码所花费的总时间以及特定代码段被调用的次数。
Julia中有这样的功能吗?内置或通过某些第三方包。

最佳答案

有一个Profiling 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
被降低到
julia> @code_llvm f()
;  @ REPL[8]:1 within `f'
define i64 @julia_f_594() {
top:
;  @ REPL[8]:7 within `f'
  ret i64 5000000050000000
}
IE。根本没有循环。这就是为什么使用行在所有回溯集中出现的频率而不是执行时间代理指标的原因。当然,它与执行时间不同,但它很好地近似了瓶颈所在的位置,因为执行时间长的行更频繁地出现在回溯中。

关于julia - 可以逐行分析 Julia 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65625496/

相关文章:

dictionary - 数组到 julia 中的元组

optimization - 如何告诉LLVM可以优化远距仓储?

julia - Julia 推吗?需要整个数组的副本

julia - 如何将数组数组转换为矩阵?

数据框创建整数 julia 的新列

arrays - Julia 中的分区等效项

julia - 在 Julia 中为数字创建包装类

arrays - 在 Julia 中创建一个数组

machine-learning - MLJ : selecting rows and columns for training in evaluate

multithreading - 为什么鼓励 Julia 中的去向量化?