fortran - 在 Fortran 中获得准确的运行时间
问题描述
我需要设置现有的 Fortran 代码以在时间限制(即 24 小时周期)内运行。我正在尝试实现一个简单的运行时计时,它测量代码正在运行的“真实生活”时间(不是 CPU 时间)并执行正确的保存和终止例程。由于这种检查经常发生,我不想真正得到一整天的时间并从中计算总小时/分钟。我更喜欢一些CPU_TIME()
简单的东西(Current-Start)/3600
(我真的只需要几个小时的分辨率)。
我实际上尝试CPU_TIME()
以最简单的方式实现它,它似乎工作时间很短,但显然随着时间的增加,有一个“漂移”,我最终运行的时间比实际时间限制略多,这会终止我的代码而不保存一个“检查点”。除了尝试设置小时数的下限以尝试解释“漂移”之外,是否有更精确但更简单的实现可以在几分钟内获得正确的运行时间?
编辑:我也尝试过使用system_clock
,但是这个例程的实际时间和输出时间完全关闭了......我做错了什么?
INTEGER :: scount, & ! Starting "time"
ecount, & ! Ending "time"
rate ! number of clock ticks per second
call system_clock(scount,rate)
...
<CODE>
...
call system_clock(ecount)
timer_elapsed_time = real(ecount-scount,8)/real(rate,8)
write(*,*) "Calculated run time is ",timer_elapsed_time *3600," hours"
解决方案:时钟频率在某些情况下可以real
和不可以integer
,比如我的情况。
解决方案
发布的代码使用整数来获取系统的时钟速率。 system_clock
也可以使用实变量调用以返回速率。我的怀疑,现在通过交换意见得到证实,是整数是时钟速率的不准确表示,从而解释了使用system_clock
.
OP 报告通过使用时钟速率的实变量来解决问题。
推荐阅读
- python - 当我运行我的代码时,它返回'[]'。我怎样才能解决这个问题?
- android - 带有 setOnClickListener 的 RecyclerView
- vb.net - 为什么在调试输出中出现“System.Data.SQLite.dll”的“Disposed Exceptions”?
- python - 根据日期列过滤和创建列
- azure - 在 Azure 应用程序网关中拒绝动态公共 IP 配置的策略
- r - r闪亮的悬停与多面板图
- python - 缩放对数正态拟合
- regex - 如何让我的 Access VBA 正则表达式返回所有可能的匹配项,而不仅仅是第一个匹配项?
- r - 将行重复聚合为单行
- json - JQ:获取元素ID,如果它包含一个键