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