2012-07-02 3 views
3

Цель этого приложения - запланировать максимально возможное количество большого количества машин в магазине. Процесс рекурсивный, сбор графики и измерение эффективности. Это работает, но требуется буквально несколько дней для запуска. Значительная утечка времени блокового кода ниже:Эффективность во время итерации дат в PHP

foreach($machines AS $machine) { 
# To begin, we analyze the schedule thus far to get this machine's existing schedule. 
    $machSched = array(); 
    foreach($schedule AS $booking) { 
     if($booking['mach']==$machine && strtotime($booking['end']) > date('U')) { 
      $machSched[] = $booking; 
     } 
    } 
    # We seek the next time the machine can be booked. We begin by sorting its current bookings. 
    aasort($machSched, 'start'); 
    # Now we construct the list of available times 
    $lastEnd = date('U'); 
    $freeTimes=array(); 
    foreach($machSched AS $booking) { 
     if(strtotime($booking['start']) > $lastEnd) $freeTimes[] = array('start' => $lastEnd, 'end' => strtotime($booking['start'])); 
     $lastEnd = strtotime($booking['end']); 
    } 
    $freeTimes[] = array('start' => $lastEnd, 'end' => strtotime('2030-12-31')); 
    # Now we go through each available timeslot to see what we can book. 
    foreach($freeTimes AS $slot) { 
        // Scheduling stuff here... 
    } 
} 

Этого блок перебирает существующие расписанию для каждой машины, сортирует их и создает массив «свободных слоты» (время между существующим запланированными элементами я. оптимизировал и оптимизировал эту программу, но я не могу придумать лучший способ сделать эту маленькую часть. Обратите внимание, что aasort - это функция для сортировки массива ассоциативных массивов с помощью ключа в ассоциативных массивах.

Любая помощь будет принята с благодарностью

ответ

2

Вы много делаете преобразование времени (date() и strftotime()), но вы n избегайте всей этой работы, используя time() и настройки внутри $ booking ['start'] и $ booking ['end'] простое число.

ADD

Конечно, вы можете кэшировать все "постоянные" значения во временном Варсе: дата ('U'), StrToTime ('2030-12-31')).

+0

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

+0

Я могу только изобразить, что ** aasort ($ machSched, 'start') **, но если start уникален для $ machine, вы можете $ machSched [$ start] = $ booking; и использовать ksort –

2

Если вы знаете формат сохранения дат, вероятно, вы должны использовать strptime вместо strtotime. Использование strtotime означает, что каждый вызов должен самостоятельно определять способ форматирования даты, поэтому вам приходится учитывать этот диагноз в каждом отдельном цикле. Это может быть значительная разница.

Мои простые тесты показывают, что time() примерно на порядок быстрее, чем date('U'), и что strptime() является 5 раз быстрее, чем strtotime().

+0

Спасибо! При этом я смог побрить 2 секунды за итерацию и довести общее время выполнения до дня. Очевидно, еще долгий путь, но определенное улучшение. – user1412922

+0

@ user1412922: Добро пожаловать. Когда вы используете эффективные варианты функций и кешируете все, что можете, то единственное, что вы можете сделать, это записать его на скомпилированный язык (или запустить его как-то параллельно). –

Смежные вопросы