PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 110


Проблема

Функция time возвращает время с точностью до секунды. Требуется измерить вре­мя с более высокой точностью.

Решение

Иногда эта проблема неразрешима. Если на вашем компьютере Perl поддержива­ет функцию syscall, а в системе имеется функция типа gettimeofday(2), вероят­но, ими можно воспользоваться для измерения времени. Особенности вызова syscall зависят от конкретного компьютера. В комментарии приведен пример­ный вид фрагмента, однако его переносимость не гарантирована.

На некоторых компьютерах эти функциональные возможности инкапсулиру­ются в модуле Time::HiRes (распространяется с CPAN):

use Time    HiRes qw(gettimeofday), $tO = gettimeofday, ## Ваши операции $t1 = gettimeofday, $elapsed = $t1  - $tO,

# $elapsed - значение с плавающей точкой,   равное числу секунд

#   между $t1  и $t2

Комментарий

В следующем фрагменте модуль Time::HiRcs используется для измерения про­межутка между выдачей сообщения и нажатием клавиши RETURN:

use Time HiRes qw(gettimeofday), print "Press return when ready ", Sbefore = gettimeofday; $lme = <>;

$elapsed = gettimeofday-Sbefore, print You took $elapsed seconds \n , Press return when ready: You took 0.228149 seconds.

Сравните с эквивалентным фрагментом, использующим syscall:


108   Глава 3 • Дата и время

require   'sys/syscall ph ,

#  Инициализировать структуры,   возвращаемые gettirneofday
$TIMEVAL_T =    LL

$done = $start = pack($TIMEVAL_T,   ()),

# Вывод приглашения

print Press return when ready

# Прочитать время в $start
syscall(&SYS_gettimeofday, Sstart 0)) '= -1

|[ die gettimeofday $' ,

#  Прочитать перевод строки
$lme = <>,

#  Прочитать время в $done
syscall(&SYS_gettimeofday, $done 0) '= -1

I| die gettimeofday $'

it Распаковать структуру

@start = unpack($TIMEVAL_T, Sstart),

@done = unpack($TIMEVAL_T, $done),

ft Исправить микросекунды

for ($done[1], $start[1]) { $_ /= 1_000_000 }

# Вычислить разность

$delta_time = sprintf % 4f , ($done[0] + $done[1] )




- Начало -  - Назад -  - Вперед -