@Newer123

Как оптимизировать PHP код в данном примере?

Начинаю изучать PHP и решил задачу вот таким способом
<?php
$arrX = array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20);
$arrY = array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19);
$iter = 100000;
$start = microtime(true);

$number_p = 3.14;
$distance = 40 / 5;
$total = 0;

for ($a = 0; $a < $iter; $a++) {
    for ($i = 0; $i < count($arrX); $i++) {
        for ($j = 0; $j < count($arrY); $j++) {
            $value = ($arrX[$i] * ($number_p + $a)) * ($arrY[$j] + ($number_p * $distance));

            switch ($i) {
                case 3:
                    $total = $total + $value + 100;
                    break;
                case 6:
                    $total = $total + $value + 500;
                    break;
                case 9:
                    $total = $total + $value + 1000;
                    break;
                default:
                    $total = $total + $value;
                    break;
            }

            if ($value % 2 == 0) {
                $total = $total + 1;
            }

            if ($value % 2 != 0) {
                $total = $total + 2;
            }
        }
    }
}
echo "Total: $total";

$time = microtime(true) - $start;
echo "<br>Script time is $time";


Знаю, что код можно оптимизировать и цель уменьшить время исполнения.
5dc2791c358f8624713775.jpeg
Это тренировчная задача и цель просто как можно лучше оптимизировать.
Подскажите, пожалуйста, как можно оптимизировать данный код?
  • Вопрос задан
  • 188 просмотров
Решения вопроса 3
cesnokov
@cesnokov
<head>&nbsp;</head>
Немного ускорить можно отказавшись от подсчёта длины массивов в циклах, посчитав их только по разу:
$arrXcount = count($arrX);
$arrYcount = count($arrY);

for ($a = 0; $a < $iter; $a++) {
    for ($i = 0; $i < $arrXcount; $i++) {
        for ($j = 0; $j < $arrYcount; $j++) {
            ...
        }
    }
}


Также можно отказаться от двойного сравнения, поменяв это:
if ($value % 2 == 0) {
    $total = $total + 1;
}
if ($value % 2 != 0) {
    $total = $total + 2;
}

на это:
if ($value % 2 == 0) {
    $total = $total + 1;
} else {
    $total = $total + 2;
}


#PS: Ещё несколько микро шагов можно убрать отказавшись от двойных кавычек, а следовательно переменных в строках:
echo "Total: $total";
echo "<br>Script time is $time";

Используя одинарные кавычки, говорим интерпретатору, что не нужно в этой строке ничего искать и исправлять, просто выводим результат:
echo 'Total: ' . $total;
echo '<br>Script time is ' . $time;
Ответ написан
@neol
У вас большая часть выражения может быть вынесена из цикла и рассчитана 1 раз, а не 100000. Как-то так:
for ($i = 0; $i < count($arrX); $i++) {
    for ($j = 0; $j < count($arrY); $j++) {
        $tmpValue = $arrX[$i] * ($arrY[$j] + ($number_p * $distance));
        for ($a = 0; $a < $iter; $a++) {
            $value = $tmpValue * ($number_p + $a);
Ответ написан
toxa82
@toxa82
<?php
$arrX = array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20);
$arrY = array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19);
$iter = 100000;
$start = microtime(true);

$number_p = 3.14;
$distance = 40 / 5;
$total = 0;

$cntX = count($arrX);
$cntY = count($arrY);

$var0 = $number_p * $distance;
for ($a = 0; $a < $iter; $a++) {
    $varA = $number_p + $a;
    foreach ($arrX as $i => $x) {
        $varB = $x * $varA;
        foreach ($arrY as $j => $y) {
            $value = $varB * ($y + $var0);
            $total += $value;
            switch ($i) {
                case 3:
                    $total += 100;
                    break;
                case 6:
                    $total += 500;
                    break;
                case 9:
                    $total += 1000;
                    break;
            }
            if ($value % 2 == 0) {
                $total = $total + 1;
            } else {
                $total = $total + 2;
            }
        }
    }
}
echo "Total: $total";

$time = microtime(true) - $start;
echo "<br>Script time is $time";
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
<?php
$start = microtime(true);

$total = '1.9317181388926E+14';
echo "Total: $total\n";

$time = microtime(true) - $start;
echo "<br>Script time is $time\n";

выводит
Total: 1.9317181388926E+14
<br>Script time is 2.7179718017578E-5
Какой вопрос, такой и ответ
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы