本文主要是介绍ENVI IDL:如何监测代码运行时间(计时器函数实现)?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
01 预想
我预想的是在循环中加入一个函数,可以监测相邻两次循环的运行时间,正常操作如此:
pro unknowfor ix = 0, 5 do beginstart_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 beginwait, 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 example1common example, me, youme = 'HzH'you = '???'
endpro example2common example, me, youprint, me, you, format='%s-%s'
end
运行结果:
但是如果,不使用common
公共块,如下:
pro example1me = 'HzH'you = '???'
endpro example2print, me, you, format='%s-%s'
end
运行如下:
所以我们的时间计时器可以写为下面形式:
function timer_keep; 存储全局状态common time_block, timekeeping_old; 判断是否为当前第一次调用if ~n_elements(timekeeping_old) then begintimekeeping_old = systime(1)return, 0endif; 所花时间timekeeping_new = systime(1)timekeeping_interval = timekeeping_new - timekeeping_oldtimekeeping_old = timekeeping_new ; 刷新return, timekeeping_interval
END
缺点就是,第一次调用该函数,输出是0s,这似乎并不好解决。
forix = 0, 5 do beginwait, randomu(systime(1), 1) ; 此处systime(1)仅仅作为seed种子print, '第', ix + 1, '次循环运行时间: ', timer_keep(), format='%s%02d%s%0.2f s'
endfor
运行结果:
如果想要解决第一次运行为0的问题,那么解决办法就是循环开始和结束都使用一次timer_keep()
函数。但是似乎又回到原点了?暂且如此,bye~.
这篇关于ENVI IDL:如何监测代码运行时间(计时器函数实现)?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!