Производительность массива PHP

Я тестирую алгоритм двухмерной упаковки контейнеров и выбрал PHP, чтобы его смоделировать, поскольку сейчас это мой язык хлеба с маслом.

Как вы можете видеть на http: // themworks .com / pack_v0.2 / oopack.php? ol = 1 он работает довольно хорошо, но вам нужно подождать около 10-20 секунд, чтобы упаковать 100 прямоугольников. Для некоторых труднообрабатываемых наборов он достигнет лимита времени выполнения php 30 секунд.

Я провел некоторое профилирование, и оно показывает, что большую часть времени мой скрипт проходит через разные части небольшого 2-мерного массива с 0 и 1 в нем. Он либо проверяет, равна ли определенная ячейка 0/1, либо устанавливает значение 0/1. Он может выполнять такие операции миллион раз, и каждый раз это занимает несколько микросекунд.

Думаю, я мог бы использовать массив логических значений в статически типизированном языке, и все было бы быстрее. Или даже сделать массив из 1-битных значений. Я' Я думаю о том, чтобы все это преобразовать на какой-нибудь компилируемый язык. Разве PHP не подходит для этого?

Если мне нужно преобразовать его, скажем, в C ++, насколько хороши автоматические преобразователи? Мой сценарий - это просто множество циклов for с основными манипуляциями с массивами и объектами.

Edit. Эта функция вызывается чаще, чем любая другая. Он считывает несколько свойств очень простого объекта и просматривает очень небольшую часть небольшого массива, чтобы проверить, есть ли какой-либо элемент, не равный 0.

function fits($bin, $w, $h, $x, $y) {

    $w += $x;
    $h += $y;

    for ($i = $x; $i < $w; $i++) {

        for ($j = $y; $j < $h; $j++) {

            if ($bin[$i][$j] !== 0) {
                return false;
            }
        }
    }

    return true;    
}

Обновление: я пробовал использовать массив 1d вместо 2d в качестве одного из предложенные ответы. Поскольку мне всегда нужно было иметь доступную текущую ширину бункера, я решил обернуть все в объект. Также теперь в каждом цикле нужно рассчитывать индекс. Теперь скрипту требуется еще больше времени для запуска. Другие методы не привели к значительному увеличению производительности, скорее сделал код менее читабельным. Думаю, пора для HipHop.

Обновление: поскольку hiphop php работает только на linux, а у меня его нет, я решил переписать все это на C ++. Приятно освежить старые навыки. Кроме того, если я найду способ использовать хип-хоп, будет интересно сравнить написанный от руки код C ++ и тот, который сгенерирует один хип-хоп.

Обновление: я переписал это на C ++, в среднем он работает в 20 раз быстрее и использует гораздо меньше памяти. Дай мне посмотреть, смогу ли я сделать это еще быстрее.

36
задан ROMANIA_engineer 20 June 2017 в 19:30
поделиться