Какова производительность PHPs strtotime ()? - PullRequest
1 голос
/ 11 октября 2010

Я делаю несколько больших итераций списка временных меток: помещаю их в таблицы с диапазонами дат и группирую их по диапазонам. Для этого я нашел strtotime() очень полезную функцию, но меня беспокоит ее производительность .

Например, функция, которая перебирает список недель (скажем, недели с 49 по 05) и должна определять начало недели и метку времени в конце этой недели. Полезный способ сделать это:

foreach ($this->weeks($first, $amount) as $starts_at) {
  $ends_at = strtotime('+1 week', $starts_at);
  $groups[$week_key] = $this->slice($timestamps, $starts_at, $ends_at);
}

//$this->weeks returns a list of timestamps at which each week starts.
//$this->slice is a simple helper that returns only the timestamps within a range, from a list of timestamps. 

Вместо strtotime() я мог бы потенциально определить количество секунд между началом и концом недели, в 99% случаев это будет 24 * 60 * 60 * 7. Но в тех редких случаях, когда есть DST-переключатель, этот 24 должен быть либо 23, либо 25. Код для такого решения, вероятно, будет намного медленнее, чем strtotime(), а не?

Я использую одни и те же шаблоны для диапазонов лет, месяцев (месяцы, очень противоречивые!), Дней и часов. Я подозреваю, что только с часами простое добавление 3600 к отметке времени будет быстрее.

Есть еще какие-нибудь ошибки? Существуют ли способы (которые не зависят от PHP5.3!), Которые предлагают более совершенные маршруты для согласованных, безопасных для летнего времени и безопасных диапазонов дат високосного года?

Ответы [ 4 ]

10 голосов
/ 12 октября 2010

Почему вы беспокоитесь о его производительности? У вас есть доказательства того, что это замедляет работу вашей системы? Если нет, не пытайтесь слишком усложнить решение по ненужным причинам. Помните, что premature optimization is the root of all evil. Напишите читабельный код, который имеет смысл, и оптимизируйте его, только если вы ЗНАЕТЕ, что это будет проблемой ...

Но еще нужно учесть, что это также скомпилированный C-код, поэтому он должен быть достаточно эффективным для того, что он делает. Вы МОЖЕТЕ быть в состоянии построить подмножество кода на PHP и сделать его быстрее, но это будет трудной работой (из-за всех накладных расходов, связанных с PHP-кодом).

Как я уже говорил, используйте его, пока не докажете, что это проблема, а затем исправьте эту проблему. Не забывайте переписывать его для своих нужд тоже не бесплатно. Это требует времени и вносит ошибки. Стоит ли оно того, чтобы выигрыш был минимальным (это означает, что это не было проблемой производительности с самого начала). Так что не пытайтесь микрооптимизировать, если вы не ЗНАЕТЕ, что это проблема ...

1 голос
/ 17 ноября 2017

Чтобы ответить на вопрос, в конце концов:

На основе многих критериев, подобных этому: https://en.code -bude.net / 2013/12/19 / benchmark-strtotime-vs-datetime-vs-gettimestamp-in-php /

Мы видим, что strtotime() более эффективен, чем мы можем думать.Так что да, чтобы преобразовать строку в метку времени, функция strtotime имеет довольно хорошую производительность .

0 голосов
/ 11 октября 2010

Я знаю, что это, вероятно, не тот ответ, который вы ищете, но лучше всего ставить профилирование с учетом реального варианта использования .

Мой инстинкт в том, что, как вы думаете, strtotime будет медленнее. Но даже если, скажем, в 3 раза медленнее, это имеет смысл только в контексте. Возможно, ваша процедура с реальными данными занимает 60 мс с использованием strtotime, поэтому в большинстве случаев вы экономите 40 мс (я полностью составил эти цифры, но вы поняли). Таким образом, вы можете обнаружить, что оптимизация этого не окупится (учитывая, что вы открываете свой код для большего количества потенциальных ошибок, и вам придется потратить больше времени, чтобы исправить это).

Кстати, если у вас есть хорошие инструменты для профилирования, это здорово, но даже если вы не сравниваете временные метки, вы получите грубое представление.

0 голосов
/ 11 октября 2010

Очень интересный вопрос. Я бы сказал, что единственный способ понять это - создать собственный тест производительности. Обратите внимание на значение microtime () в начале и конце скрипта, чтобы определить производительность. Запустите смешное количество значений через цикл одним методом, а затем другим методом. Сравните время.

...