Итак, для моей библиотеки криптографии у меня есть базовый конвертер , который я использую довольно часто. Это не самая эффективная вещь в мире, но она работает довольно хорошо для всех диапазонов ввода.
Большая часть работы выполняется циклом обратного вызова:
$callback = function($source, $src, $dst) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$e = floor(($n + $remainder * $src) / $dst);
$remainder = ($n + $remainder * $src) % $dst;
if ($div || $e) {
$div[] = $e;
}
}
return array(
$div,
$remainder
);
};
while ($source) {
list ($source, $remainder) = $callback($source, $srcBase, $dstBase);
$result[] = $remainder;
}
По сути, он принимает массив чисел в $srcBase
и преобразует их в массив чисел в $dstBase
. Таким образом, пример ввода будет array(1, 1), 2, 10
, что даст array(3)
в результате. Другим примером будет array(1, 0, 0), 256, 10
, который даст array(1, 6, 7, 7, 7, 2, 1, 6)
(каждый элемент массива представляет собой одну «цифру» в $dstBase
.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, если я передаю 2 КБ данных, для ее запуска требуется почти 10 секунд. Поэтому я решил оптимизировать его. До сих пор у меня осталось около 4 секунд, заменив всю эту структуру рекурсивным циклом:
while ($source) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$dividend = $n + $remainder * $srcBase;
$res = (int) ($dividend / $dstBase);
$remainder = $dividend % $dstBase;
if ($div || $res) {
$div[] = $res;
}
}
$result[] = $remainder;
$source = $div;
}
Проблема, с которой я сталкиваюсь, заключается в том, как оптимизировать ее (если это вообще возможно). Я думаю, что проблема заключается в количестве итераций, которое требуется для большого ввода (для массива 2000 элементов, от базового 256 до базового 10, всего требуется 4 815 076 итераций).
Есть мысли?