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 函数重复调用自己,导致统计结果失真。