Я тестирую алгоритм для упаковки 2d bin, и я выбрал PHP для того, чтобы издеваться над этим, поскольку это мой язык хлеба и масла в настоящее время.
Как вы можете видеть на http://themworks.com/pack_v0.2/oopack.php?ol=1, он работает очень хорошо, но вам нужно подождать около 10-20 секунд для 100 прямоугольников пак. Для некоторых трудно обрабатываемых наборов он достиг бы предела времени выполнения php 30.
Я сделал некоторое профилирование, и он показывает, что большую часть времени мой script проходит через разные части небольшого 2d массива с 0 и 1 в нем. Он либо проверяет, равна ли определенная ячейка 0/1, либо устанавливает значение 0/1. Он может выполнять такие операции в миллион раз и каждый раз требуется несколько микросекунд.
Думаю, я мог бы использовать массив логических элементов на статически типизированном языке, и все будет быстрее. Или даже сделать массив из 1 битовых значений. Я собираюсь преобразовать все это в компилируемый язык. PHP просто не подходит для этого?
Если мне нужно преобразовать его, чтобы сказать С++, насколько хороши автоматические преобразователи? Мой script - это просто много для циклов с основными массивами и манипуляциями с объектами.
Изменить. Эта функция вызывается больше, чем любая другая. Он читает несколько свойств очень простого объекта и проходит через очень небольшую часть небольшого массива, чтобы проверить, есть ли какой-либо элемент, не равный 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 в качестве одного из предложенных ответов. Поскольку мне всегда нужно иметь доступную ширину бина, я решил обернуть все в объект. Кроме того, теперь в каждом цикле индекс нужно вычислить. Теперь для script требуется еще больше времени для запуска. Другие методы не принесли большого повышения производительности, а сделали код менее читаемым. Думаю, время для хип-хопа.
Обновление: поскольку hiphop php работает только на linux, и у меня его нет, я решил переписать все это на С++. Приятно освежать старые навыки. Кроме того, если я найду способ использовать хип-хоп, будет интересно сравнить написанный вручную код на С++ и создать один хип-хоп.
Обновление: я переписал эту вещь в С++, в среднем она работает в 20 раз быстрее и использует гораздо меньше памяти. Позвольте мне посмотреть, смогу ли я сделать это еще быстрее.