Я вижу странное поведение с отметкой времени, указанной модулем Perl Time::HiRes
.Почему эти временные метки не работают с Perl Time :: HiRes?
У меня есть сценарий, который получает три временные метки:
- Get временной метки с
Time::HiRes::time
- Создать новый файл, и получить его время модификации с
Time::HiRes::stat
- Получить временную метку с
Time::HiRes::time
Я бы ожидал, что отметки времени будут заказаны 1 < 2 < 3
, однако это не всегда так; часто (но не всегда), время, указанное stat
в 2., равно до временная метка от 1 ..
Я на файловой системе Ext4. Вот эксперимент:
use Time::HiRes qw/ time stat /;
while(1){
# t0
my $t0 = time;
# Create a file
my $f = '/tmp/dummy.test';
open(my $fh, '>', $f) || die;
print $fh "hi\n";
close($fh) || die;
# FS: file modification time, according to the filestystem
my $fs = (stat($f))[9];
# t1
my $t1 = time;
## Report how the timestamps relate to each other
# A. All good
if($t0 < $fs && $fs < $t1){
print "$t1,0\n";
}
# B. FS before t0
elsif($t0 > $fs && $fs < $t1){
print "$t1,1\n";
}
# C. FS after t1
elsif($t0 < $fs && $fs > $t1){
print "$t1,2\n";
}
# D. this should never happen (t0 and t1 probably can't flip)
elsif($t0 > $fs && $fs > $t1){
print "$t1,3\n";
}
}
Вот результаты пуска вышеуказанного цикла в течение нескольких секунд. где синие точки на дне являются инцидентами «правильного» поведения. Чаще всего я получаю условие B
, где время модификации от stat
составляет до первая метка времени.
Что может объяснить такое поведение?
Update: Вот сюжет из метки времени запаздывания для кулака 2000 итераций:
'$ t0- $ fs," ", $ t1- $ fs' показывают, что как $ t0, так и $ t1 очень близки друг к другу и намного опережают $ fs –