Gettimeofday: примеры (PHP)
gettimeofday(bool $return_float = false): array|floatФункция gettimeofday() возвращает информацию о текущем системном времени. Она применяется для получения времени с микросекундной точностью, что полезно для замера производительности, логирования событий или синхронизации операций.
Функция принимает один необязательный параметр:
- $return_float (bool) — определяет формат возвращаемого значения.
При вызове без аргументов или с $return_float = false функция возвращает ассоциативный массив:
- sec — секунды с начала эпохи Unix (1 января 1970 года).
- usec — микросекунды.
- minuteswest — смещение минут к западу от Гринвича.
- dsttime — тип коррекции летнего времени.
При установке $return_float = true возвращается число с плавающей точкой (float), представляющее текущее время в секундах с микросекундной точностью.
$timeArray = gettimeofday();
print_r($timeArray);
Array
(
[sec] => 1700000000
[usec] => 123456
[minuteswest] => -180
[dsttime] => 0
)
$timeFloat = gettimeofday(true);
echo $timeFloat;
1700000000.1235
$start = gettimeofday(true);
// Код для замера
usleep(100000); // Задержка 100 миллисекунд
$end = gettimeofday(true);
$executionTime = $end - $start;
echo sprintf("Время выполнения: %.6f сек", $executionTime);
Время выполнения: 0.100152 сек
Функция microtime() также возвращает текущую временную метку с микросекундами. Различие в формате вывода: microtime по умолчанию возвращает строку, но может вернуть float при вызове с параметром true.
echo microtime(true);
1700000000.1235
Функция time() возвращает количество секунд с начала эпохи Unix без микросекунд. Используется, когда высокая точность не требуется.
echo time();
1700000000
Функция hrtime() доступна с PHP 7.3 и предоставляет монотонное время с наносекундной точностью. Предпочтительна для точных замеров производительности.
$start = hrtime(true);
usleep(1000);
$end = hrtime(true);
echo $end - $start . ' наносекунд';
1023000 наносекунд
Gettimeofday в Python
Модуль time предоставляет функцию time() для секунд и perf_counter() для высокоточных замеров.
import time
t = time.time()
print(t)
1700000000.123456
Gettimeofday в Javascript
Метод performance.now() возвращает время с микросекундной точностью относительно начала загрузки страницы.
console.log(performance.now());
12345.678901234
Gettimeofday в MySQL
Функция NOW() возвращает текущую дату и время с точностью до секунд, а MICROSECOND() может извлекать микросекунды.
SELECT NOW(6);
2023-11-14 12:34:56.123456
Gettimeofday в C
В языке C функция gettimeofday() из заголовка sys/time.h имеет схожую семантику, но возвращает структуру timeval.
#include
struct timeval tv;
gettimeofday(&tv, NULL);
printf("%ld.%06ld", tv.tv_sec, tv.tv_usec);
1700000000.123456
При вычитании значений float могут возникать ошибки округления. Для точных вычислений лучше использовать целочисленные значения.
$a = gettimeofday(true);
$b = gettimeofday(true);
// $a и $b могут быть одинаковыми при быстром выполнении
if ($a == $b) {
echo 'Время совпадает';
}
Время совпадает
Значение minuteswest может быть отрицательным, что указывает на смещение к востоку от Гринвича.
$time = gettimeofday();
$offset = $time['minuteswest'] / 60;
echo 'Часовой пояс: UTC' . ($offset <= 0 ? '+' : '') . -$offset;
Часовой пояс: UTC+3
Прямое сравнение float значений может давать неточные результаты из-за особенностей представления чисел с плавающей точкой.
$t1 = gettimeofday(true);
$t2 = $t1 + 0.000001;
var_dump($t1 == $t2); // Может вернуть true из-за округления
bool(true)
В PHP 8.0 функция не претерпела значительных изменений. Однако, улучшена общая производительность и стабильность работы с временными функциями.
С версии PHP 7.1.0 параметр $return_float стал необязательным и по умолчанию равен false. В более ранних версиях он требовался явно.
До PHP 5.1.0 функция всегда возвращала массив, а параметр $return_float отсутствовал. Добавление параметра произошло для совместимости с аналогичными функциями в других языках.
function generateUniqueId() {
$time = gettimeofday();
return sprintf('%d%06d', $time['sec'], $time['usec']);
}
echo generateUniqueId();
1700000000123456
function measureClosure($callback) {
$start = gettimeofday(true);
$result = $callback();
$end = gettimeofday(true);
return [
'result' => $result,
'time' => $end - $start
];
}
$data = measureClosure(function() {
return array_sum(range(1, 100000));
});
print_r($data);
Array
(
[result] => 5000050000
[time] => 0.012345
)
function getLogTimestamp() {
$time = gettimeofday();
$micro = sprintf('%06d', $time['usec']);
$date = date('Y-m-d H:i:s.', $time['sec']);
return $date . $micro;
}
echo getLogTimestamp();
2023-11-14 12:34:56.123456
function syncOperation() {
$current = gettimeofday();
$targetSec = $current['sec'] + 1;
$targetUsec = 500000; // Полсекунды
do {
$now = gettimeofday();
$diff = ($targetSec - $now['sec']) * 1000000
+ ($targetUsec - $now['usec']);
} while ($diff > 0);
echo 'Синхронизация выполнена';
}
Синхронизация выполнена
function getTimezoneInfo() {
$time = gettimeofday();
$hours = -$time['minuteswest'] / 60;
$dst = $time['dsttime'] ? 'Действует летнее время' : 'Летнее время отсутствует';
return sprintf('UTC%s%.1f, %s',
$hours >= 0 ? '+' : '',
$hours,
$dst
);
}
echo getTimezoneInfo();
UTC+3.0, Летнее время отсутствует