ENVI IDL:如何监测代码运行时间(计时器函数实现)?

01 预想

我预想的是在循环中加入一个函数,可以监测相邻两次循环的运行时间,正常操作如此:

pro unknow
    for ix = 0, 5 do begin
        start_timekeeping = systime(1)
        wait, randomu(systime(1), 1)  ; 此处systime(1)仅仅作为seed种子
        end_timekeeping = systime(1)
        print, '第', ix + 1, '次循环运行时间: ', end_timekeeping - start_timekeeping, format='%s%02d%s%0.2f s'
    endfor
end

需要使用到两次systime,分别为循环开始和结尾各一次,是否可以只调用一次函数解决呢?

预想如下:

for ix = 0, 5 do begin
        wait, randomu(systime(1), 1)  ; 此处systime(1)仅仅作为seed种子
        print, '第', ix + 1, '次循环运行时间: ', timer_keep(), format='%s%02d%s%0.2f s'
    endfor

毫无疑问,timer_keep函数应该存储全局变量,否则无法记录相邻两次调用的间隔时长。查找IDL的全局变量设置方法,似乎并没有全局变量的设置方法,约莫半晌。查到common关键字,称为公共块,不同IDL进程或者函数均可以访问该块内的变量,公共块在进程结束时不会被销毁。语法如下:

COMMON Block_Name, Variable1, …, Variablen

举例使用如下:

pro example1
    common example, me, you
    me = 'HzH'
    you = '???'
end

pro example2
    common example, me, you
    print, me, you, format='%s-%s'
end

运行结果:

ENVI IDL:如何监测代码运行时间(计时器函数实现)?_第1张图片

但是如果,不使用common公共块,如下:

pro example1
    me = 'HzH'
    you = '???'
end

pro example2
    print, me, you, format='%s-%s'
end

运行如下:

ENVI IDL:如何监测代码运行时间(计时器函数实现)?_第2张图片

所以我们的时间计时器可以写为下面形式:

function timer_keep
    ; 存储全局状态
    common time_block, timekeeping_old
    
    ; 判断是否为当前第一次调用
    if ~n_elements(timekeeping_old) then begin
        timekeeping_old = systime(1)
        return, 0
    endif
    
    ; 所花时间
    timekeeping_new = systime(1)
    timekeeping_interval = timekeeping_new - timekeeping_old
    timekeeping_old = timekeeping_new  ; 刷新
    
    return, timekeeping_interval
END

缺点就是,第一次调用该函数,输出是0s,这似乎并不好解决。

forix = 0, 5 do begin
    wait, randomu(systime(1), 1)  ; 此处systime(1)仅仅作为seed种子
    print, '第', ix + 1, '次循环运行时间: ', timer_keep(), format='%s%02d%s%0.2f s'
endfor

运行结果:

ENVI IDL:如何监测代码运行时间(计时器函数实现)?_第3张图片

如果想要解决第一次运行为0的问题,那么解决办法就是循环开始和结束都使用一次timer_keep()函数。但是似乎又回到原点了?暂且如此,bye~.

你可能感兴趣的:(IDL,开发语言,经验分享)