我希望在Perl中以毫秒为单位获得系统时间。
我尝试了Time::HiRes
模块,它只支持微秒。
非常感谢任何帮助。
答案 0 :(得分:3)
Perl get Time
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 年之后 | 比微秒分辨率还差 |