Osheep

时光不回头,当下最重要。

Fortran编写程序运行计时器

《Fortran编写程序运行计时器》

runtime

很多编程用的IDE在调试时,当程序结束时会有类似[Finished in 0.012s]字样来统计程序运行总时长,在有些情况我们需要用到这样一个小功能,在此我将用Fortran实现这样一个小程序。

功能分析

  • runtime后的命令行整体作为目标命令在框架内执行。
  • 在执行目标命令前后获取系统时间(精确到毫秒)相减得到目标命令运行时长。

代码实现

  1. 命令行处理
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) ! 由输入参数拼接出目标指令
  1. 执行命令行前后获取系统时间
call system_clock(time(0))
call system(cmd_line)
call system_clock(time(1))
  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

知识要点

  1. 命令行处理
    • iargc()获取参数个数。
    • call getarg(i, arg)获取第i个参数。
  2. 字符串处理
    • write(str_variable, format) variables将变量列表variables按照指定格式format输入到字符串变量str_variable中。
    • write(unit, fmt)的格式化输出。
  3. 获取系统日期和时间
    • call system_clock(count [, count_rate] [, count_max])从系统时钟获取当前时间,count为整型变量,存储当天时间到毫秒。如果要计算长时间运行的程序时间,则需要添加count_max参数来增大统计上限或者改用data_and_time

结语

这只是统计运行时间的一种简单实现方法,但可以满足我的需求,更优的方法还有待摸索!

参考资料

[1] 彭国伦.《Fortran95程序设计》.北京:中国电力出版社,2002.06.
点赞