我正在用Fortran编写一个程序,我需要一种将程序持续时间计算到毫秒的方法。我一直在使用函数"date_and_time",它给我留下了一个数组,其中包含以小时、分钟、秒和毫秒为单位的系统时间。
我相信我可以在程序开始时调用这个函数来存储当前时间,然后在程序结束时再次调用该函数来存储最新时间。但在那之后,我将如何计算持续时间?我试着只减去这些值,但毫秒在一秒钟后重置,就像秒在一分钟后重置一样。解决这一问题的最佳方式是什么?
这是程序:
PROGRAM TEST_TIME_AND_DATE
INTEGER I
REAL J
INTEGER TIME_A(8), TIME_B(8)
CALL DATE_AND_TIME(VALUES=TIME_A)
PRINT '(8I5))', TIME_A
DO I = 0, 400000000
J = I * I - J
END DO
CALL DATE_AND_TIME(VALUES=TIME_B)
print '(8I5))', TIME_B
END PROGRAM TEST_TIME_AND_DATE
结果是:
2011 6 11 -300 9 14 49 304
2011 6 11 -300 9 14 50 688
我不知道在这里该怎么办,谢谢。
如果您想要经过的时钟时间,那么使用内部过程system_clock会更简单,因为它提供了单个时间值输出。(还有其他参数可以提供有关过程的信息,这就是为什么它是过程而不是函数。)例如,请参阅,http://gcc.gnu.org/onlinedocs/gfortran/SYSTEM_005fCLOCK.html.如果要计时CPU使用情况,请使用CPU_time。对于任何一个,两个调用,在程序的开始和结束,然后有一个简单的区别。您可以使用COUNT_RATE参数将时间的整数计数转换为秒。
您可以减去数字,然后将所有内容转换为毫秒,并将毫秒、秒、分钟、小时、…相加。。。
在你的情况下,这将是
0 + 0 + 0 + 0 + 0 + 1*1000 + 384 = 1384 [ms]
这种方法也适用于溢出,因为如果负数都转换为相同的基,则左多列中的正数会超过负数。例如0:58.000
至1:02.200
产生
1 * 60000 + (-56) * 1000 + 200 = 4200
请注意,这确实适用于天,但不适用于月,因为它们没有共同的长度。
您可以计算从某个开始时间(对于UNIX,1970年1月1日)开始的偏移量(以秒或毫秒为单位)。这些数字的差异是你所用的时间。
(2011 - 1970) * (number of seconds in a year) +
(month of the year - 1) * (number of seconds in a month) +
(day of the month - 1) * (number of seconds in a day) +
( ... )