Как я могу сделать эти петли быстрее? - PullRequest
0 голосов
/ 28 июня 2019

Я использую PHP4 для проекта, над которым я работаю. Мне пришлось расширить этот код (который работает достаточно быстро для данных под рукой):

for ($i = 1; $i <= count($arr); $i++) {
$a = $arr[$i]['date'];
    for ($y = 1; $y <= 10000000; $y++) {
      $c = $arr[$i]['data'][$y];
      // here I inserted another loop
    }
}

Я вставил в него еще один цикл, вот так:

for ($k = $i + 1; $k <= count($arr); $k++) {
    $next_is_empty = false;
    $next_is_null = false;
    if ($arr[$k]['data'][$y] == '') {
        $next_is_empty = true;
        break;
    } elsif (is_null($arr[$k]['data'][$y])) {
        $next_is_null = true;
        break;
    }
}

Код является более общей идеей, чем конкретный рабочий код, так как я пишу по памяти. Тем не менее, я думаю, что это достаточно точно для моих вопросов. Итак, этот цикл, который я вставил, работает в большинстве случаев нормально, но в некоторых он слишком медленный - как я могу ускорить его? Меня также интересуют общие правила исполнения, основанные на этом примере. Я знаю, что лучше избегать вложенных циклов, но почему, например, код работает достаточно быстро, если я помещаю переменные $next_is_empty/null перед моим циклом (тогда решение неверное, но достаточно быстрое)? Я знаю, что нужно сделать больше переназначений, но почему они занимают так много времени?

1 Ответ

3 голосов
/ 28 июня 2019

не используйте count () в цикле, сделайте count () в другой строке, а затем используйте переменную в цикле

$count =  count($arr);
for ($i = 1; $i <= $count; $i++) {
$a = $arr[i]['date'];
    for ($y = 1; $y <= 10000000; $y++) {
      $c = $arr[i]['data'][y];
      // here I inserted another loop
    }
}

таким образом получаются лучшие результаты тестирования

Точка определения переменной $ next_is_empty вне цикла, трудно ответить, поскольку - насколько я знаю - это зависит от используемой вами версии PHP, но лучше поставить внешнюю, то есть оригинальную.

...