很多编程用的IDE在调试时,当程序结束时会有类似
[Finished in 0.012s]
字样来统计程序运行总时长,在有些情况我们需要用到这样一个小功能,在此我将用Fortran实现这样一个小程序。
功能分析
- 将
runtime
后的命令行整体作为目标命令在框架内执行。 - 在执行目标命令前后获取系统时间(精确到毫秒)相减得到目标命令运行时长。
代码实现
- 命令行处理
character(len=1024) :: cmd_line
character(len=64) :: args(16)
integer :: i, narg, time(0:1)
narg = iargc()
do i = 1, narg
call getarg(i,args(i))
end do
write(cmd_line,"(TR1,16A)") args(1:narg) ! 由输入参数拼接出目标指令
- 执行命令行前后获取系统时间
call system_clock(time(0))
call system(cmd_line)
call system_clock(time(1))
- 计算并输出时长信息
write(*,"('[Finished in ',(F0.3),'s]')") real(time(1)-time(0))/1000
- 完整代码
program main
!
! Execute program and count it's running time.
!
! Usage: runtime [command]
!
! Author: ph
! Email: huipan.hnu@qq.com
! Date: 2017.08.14
!
implicit none
character(len=1024) :: cmd_line ! 规定了命令行最大长度
character(len=64) :: args(16) ! 规定了每个参数的最大长度
integer :: i, narg, time(0:1)
narg = iargc()
do i = 1, narg
call getarg(i,args(i))
end do
write(cmd_line,"(TR1,16A)") args(1:narg)
call system_clock(time(0))
call system(cmd_line)
call system_clock(time(1))
write(*,"('[Finished in ',(F0.3),'s]')") real(time(1)-time(0))/1000
end program main
- 编译执行
gfortran runtime.f90 -o runtime
./runtime xxx
知识要点
- 命令行处理
-
iargc()
获取参数个数。 -
call getarg(i, arg)
获取第i个参数。
-
- 字符串处理
-
write(str_variable, format) variables
将变量列表variables
按照指定格式format
输入到字符串变量str_variable
中。 -
write(unit, fmt)
的格式化输出。
-
- 获取系统日期和时间
-
call system_clock(count [, count_rate] [, count_max])
从系统时钟获取当前时间,count
为整型变量,存储当天时间到毫秒。如果要计算长时间运行的程序时间,则需要添加count_max
参数来增大统计上限或者改用data_and_time
-
结语
这只是统计运行时间的一种简单实现方法,但可以满足我的需求,更优的方法还有待摸索!
参考资料
[1] 彭国伦.《Fortran95程序设计》.北京:中国电力出版社,2002.06.