2026a
# Julia 调试性能分析
# 概述
在调试复杂工程的 Julia 代码时,发现调试代码的速度比运行代码的速度慢了很多,往往需要花费大量时间定位是哪些函数导致调试速度慢。例如,下面示例 debug_example.jl,用于对图像进行局部熵滤波,目标行执行耗时约 1s,调试耗时约 18s。
# 解决方法
使用启动调试并计时查找调试过程中耗时的函数,然后将其中不需要调试的底层函数设置为编译执行,可以大幅提升调试运行速度。
操作步骤如下:
step 1: 打开需要调试的脚本,单击调试并计时工具栏按钮,开始运行;

step 2: 等待运行结束(或等待一段时间,再点击退出调试),得到统计结果如下:

注意
不要在启动调试并计时的过程中添加断点,这会影响统计结果的正确性。
step 3: 分析统计结果,根据统计结果发现
"Main._imhist"函数耗时长且无需调试,可以将该函数设置为编译模式;单击首选项,然后下拉找到调试器性能选项,单击编辑,可以打开
setting.json配置文件进行配置。
打开
settings.json配置文件后,在列表中增加一行"Main._imhist",,将该函数设置为编译模式,如下图所示:
配置修改后,保存文件,立即生效。
step 4: 重新打开需要调试的脚本,单击启动调试并计时,查看统计结果,调试耗时已和运行耗时基本保持一致。

# 局限性
对于相互循环调用的函数,启动调试并计时的统计结果偏大。例如:
# 函数A:内部调用函数B
function A(n::Int)
if n > 0
sleep(0.1)
B(n - 1)
else
println("Function A completed")
end
end
# 函数B:内部调用函数A
function B(n::Int)
if n > 0
sleep(0.1)
A(n - 1)
else
println("Function B completed")
end
end
@time A(20)
Function A completed
2.163952 seconds (1.38 k allocations: 64.969 KiB)
调试 A 函数总共仅用了 2.16 s,而统计结果显示 A 函数耗时 12s,B 函数耗时 约 11s,这是因为 A 和 B 函数重复调用自己,导致统计结果失真。
