如何在Perl中以纳秒为单位获得系统时间?

时间:2014-09-25 07:01:32

标签: perl time nanotime

我希望在Perl中以毫秒为单位获得系统时间。

我尝试了Time::HiRes模块,它只支持微秒。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

Perl get Time 使用Time :: HiRes

c:\Code>perl -MDateTime::HiRes -E "while (1) {say DateTime::HiRes->now()->strftime('%F %T.%N');}"

use Time::HiRes qw(time);
use POSIX qw(strftime);

my $t = time;
my $date = strftime "%F %T.%N", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding

print $date, "\n";

答案 1 :(得分:3)

当然,时间分辨率取决于harwdware时钟频率 例如,AMD 5200具有2.6Ghz时钟,其间隔为0.4ns。 RDTSCP的gettimeofday成本为221个周期:最多等于88ns。 Perl例程的最低成本将是数百倍......

所以,最后的答案是:

在今天的硬件上,忘记纳秒。使用Perl和任何高级语言......只需使用汇编程序即可获得这种接近度,但忘记用软件计算单个纳秒...

答案 2 :(得分:3)

Time::HiRes模块最多支持微秒。正如@MarcoS在今天所回答的那样,通用硬件无疑使用软件计算的纳秒精度。

两次后续调用,获取当前的微秒并随后打印

perl -MTime::HiRes=time -E '$t1=time; $t2=time; printf "%.6f\n", $_ for($t1, $t2)'

结果(在我的系统上)

1411630025.846065
1411630025.846069

e.g。只获得当前时间两次而且费用在3-4微秒之间。

如果你想要一些“纳秒数”,只需用9digit精度打印时间,如:

perl -MTime::HiRes=time -E '$t1=time;$t2=time; printf "%.9f\n", $_ for($t1, $t2)'

你会得到:

1411630910.582282066
1411630910.582283974

非常纳秒次;)

无论如何,你可以以合理的纳秒精度睡眠。来自doc

  

nanosleep($ nanoseconds)

     

睡眠指定的纳秒数(1e9秒)。   返回实际睡眠的纳秒数(准确   只有微秒,最接近的千分之一。)

...
     

不要指望nanosleep()精确到一纳秒。   获得1000纳秒的准确度是很好的。

答案 3 :(得分:0)

“忘记纳秒”的人都错了:普通机器上的perl现在经常在后续调用中返回相同的微秒,所以虽然现在纳秒分辨率可能无法实现,但你现在绝对需要纳秒,因为微秒是粗

以上答案是错误 - 从浮点数的不精确中捏造更多数字并不能提供更高的精确度: -

Died at -e line 1.

该代码执行此操作:

String url = "smb://fe80--60ee-226a-4263-53d3s3.ipv6-literal.net/share/path";
SmbFile file = new SmbFile(url);
file.canRead();

答案 4 :(得分:0)

最根本的问题是 Perl 的 Time::HiRes 使用一个普通的浮点值来表示时间戳,通常实现为原生 C double,在很多平台上是 64 位 IEEE 浮点数,带有一个53 位尾数。

这意味着时间戳的记录分辨率会随着它们距 1970 年的远近而变化:

<头>
大概日期范围 分辨率
1969 年 11 月 13 日 ~ 1970 年 2 月 18 日 小于0.93ns 可用纳秒级分辨率
1969 年 9 月 25 日 ~ 1970 年 4 月 8 日 1.86ns
1969年6月20日~1970年7月14日 3.73ns
1968 年 12 月 8 日 ~ 1971 年 1 月 24 日 7.45ns
1967 年 11 月 16 日 ~ 1972 年 2 月 16 日 14.9ns
1961 年 7 月 ~ 1978 年 6 月 29.8ns
1978~1986 & 1953~1961 59.6ns
1987~2003 & 1936~1952 0.119µs
2004~2037 & 1902~1935 0.238µs
2038~2105 & 1834~1901 0.477µs
2106~2242 & 1698~1833 0.954µs
1697 年之前或 2107 年之后 比微秒分辨率还差