Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Как ускорить процесс сортирования дат

#php #сортировка #оптимизация #дата


функция pc_date_sort(), приведен
ная в примере  показывает, как сортировать даты.

function pc_date_sort($a, $b) {
    list($a_month, $a_day, $a_year) = explode('/', $a);
    list($b_month, $b_day, $b_year) = explode('/', $b);
    if ($a_year > $b_year ) return 1;
    if ($a_year < $b_year ) return -1;
    if ($a_month > $b_month) return 1;
    if ($a_month < $b_month) return -1;
    if ($a_day > $b_day ) return 1;
    if ($a_day < $b_day ) return -1;
    return 0;
}
$dates = array('12/14/2000', '08/07/1999', '08/10/2001');
usort($dates, 'pc_date_sort');
echo '
';
print_r($dates);


Во время сортировки функция usort() часто – каждый раз, когда ей
надо сравнить два элемента – выполняет пересчет значений, возвра
щаемых функцией сортировки, что замедляет процесс.

Помогите пожалуйста оптимизировать код
Как избежать ненужной работы? 
    


Ответы

Ответ 1



использовать стандартный встроенный класс. Это раньше приходилось свои велосипеды городить с датами. встроенный datetime написан на C, он будет быстрее, он оттестирован и будет безопасней он предлагает больше возможностей чем свой велосипед дополнить его вы можете обернув в свой класс/функцию, унаследовав (не проверял) createFromFormat() создаст объекты из вашего формата дат без всяких дополнительных ухищрений и ручных explode-ов строчек

Ответ 2



Я добавлю свой вариант, но скорей всего буду рассматривать ваши предложния.Несмотря что протестировал вроде быстрее ,и памяти жрет меньше. Для того чтобы избежать ненужной работы, можно кэшировать сравниваемые значе ния, как показано в примере function pc_array_sort($array, $map_func, $sort_func = '') { $mapped = array_map($map_func, $array); // cache $map_func() values if ('' == $sort_func) { asort($mapped); // функция asort() быстрее функции usort() } else { uasort($mapped, $sort_func); // необходимо сохранить ключи } while (list($key) = each($mapped)) { $sorted[] = $array[$key]; // используем отсортированные ключи } return $sorted; } Чтобы избежать ненужной работы, функция pc_array_sort() использу ет временный массив $mapped для кэширования возвращаемых значе ний. Затем она сортирует массив $mapped, используя или порядок сор тировки по умолчанию, или определенную пользователем процедуру сортировки. Важно, что она использует сортировку, сохраняющую связи ключ/значение. По умолчанию она использует функцию asort(), потому что она быстрее, чем функция uasort(). (Медленность функции uasort() это всетаки значительный довод в пользу функции pc_array_sort().) Наконец, она создает отсортированный массив $sort ed, при этом отсортированные ключи в массиве $mapped выступают в ка честве индексов значений исходного массива. Для небольших массивов или коротких функций сортировки функция usort() работает быстрее, но как только число сравнений вырастает, функция pc_array_sort() обгоняет функцию usort(). Ну или сравнивать в пeрвом примере как и посоветовали следующим образом $date1 = DateTime::createFromFormat('!Y/m/d', '2012/10/17'); $date2 = DateTime::createFromFormat('!Y/m/d', '2012/10/17'); var_dump($date1 == $date2); //will be true var_dump($date1 > $date2); //will be false var_dump($date1 < $date2); //will be false

Комментариев нет:

Отправить комментарий