我预想的是在循环中加入一个函数,可以监测相邻两次循环的运行时间,正常操作如此:
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
运行结果:
但是如果,不使用common
公共块,如下:
pro example1
me = 'HzH'
you = '???'
end
pro example2
print, me, you, format='%s-%s'
end
运行如下:
所以我们的时间计时器可以写为下面形式:
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
运行结果:
如果想要解决第一次运行为0的问题,那么解决办法就是循环开始和结束都使用一次timer_keep()
函数。但是似乎又回到原点了?暂且如此,bye~.