#php #micro-optimization
#php #микрооптимизация
Вопрос:
Я пытаюсь написать функцию, которая будет возвращать количество дней между двумя датами как можно быстрее. Вызывается эта функция тысячимиллион раз в моем коде и оптимизация его по максимуму были бы действительно полезны. Даты представляют собой строки в формате yyyy-mm-dd
.
Вот лучшее, что у меня есть на данный момент:
protected function daysBetween($date1, $date2)
{
list($year1,$month1,$day1) = explode('-',$date1);
list($year2,$month2,$day2) = explode('-',$date2);
return (int)abs((mktime(0,0,0,$month1,$day1,$year1) -
mktime(0,0,0,$month2,$day2,$year2)) / 86400);
}
Как я могу выполнить это в кратчайшие сроки?
Комментарии:
1. Но является ли это дубликатом? Другой вопрос сравнивает дату и время с датой и не касается эффективности. Это касается ТОЛЬКО эффективности, поскольку у автора явно уже есть решение для получения дельты даты. В любом случае, Лешенька, я не могу придумать лучшего способа. mktime почти наверняка намного быстрее, чем strtotime, и решения, не использующие mktime, вероятно, также будут медленнее. Я думаю, вы поняли.
2. @AurelioDeRosa Этот вопрос отличается. Тот, на который вы ссылаетесь, просто хочет знать, как это сделать, однако этот хочет знать, как сделать это максимально быстрым способом .
3. Вы смотрели на php.net/manual/en/datetime.diff.php ? Можно было бы надеяться, что это будет более эффективно…
Ответ №1:
mktime()
gmmktime()
Для меня изменение на сокращает время, затрачиваемое более чем на 50%. Это единственное самое большое улучшение *, которое я вижу.
* Я не очень усердно искал. Так что, похоже, это не подходящее место для настройки вашей функции, для вашего скрипта, для вашего оборудования, для ваших индивидуальных потребностей, тем более, что он вызывается всего тысячи раз.
Комментарии:
1. Спасибо, это сработало действительно хорошо. Когда я сказал «тысячу раз», я действительно имел в виду «миллион раз». Я действительно не профилировал код в то время, но я знал, что это был виновник.
2. Оглядываясь назад, это очень удивительно. На странице руководства по php для gmmktime указано, что он использует mktime внутри. Поэтому кажется невозможным, что gmmktime будет быстрее, чем mktime. Но это определенно для меня (и для вас). Интересно, как это может быть…