Loop Code Optimization - PullRequest
       2

Loop Code Optimization

3 голосов
/ 06 июля 2010

Как я могу оптимизировать следующий код,

Мне нужно запустить 3 набора циклов, как это:

for($i=1;$i<=$count-1;$i++){    
  for($j=$i+1;$j<=$count;$j++){
  // do some query use $i and $j

  }
}
for($i=1;$i<=$count-2;$i++){
   for($j=$i+1;$j<=$count-1;$j++){   
     for($k=$j+1;$k<=$count;$k++){
       // do some query use $i and $j and $k
     }
  }
}
for($i=1;$i<=$count-3;$i++){
   for($j=$i+1;$j<=$count-2;$j++){   
      for($k=$j+1;$k<=$count-1;$k++){
     for($l=$k+1;$l<=$count;$l++){ 
       // do some query use $i and $j and $k and $l
       }
     }
  }
}

Есть ли способ упростить код, возможно, для подключенияпетли вместе?

спасибо!

Ответы [ 3 ]

2 голосов
/ 16 августа 2010

Это должно сделать (не проверено):

for($i = 1; $i <= $count - 3; $i++) {
    for($j = $i + 1; $j <= $count; $j++) {
        // i,j query

        if($j > $count - 2) {
            continue;
        }

        for($k = $j + 1; $k <= $count; $k++) {
            // i,j,k query

            if($k > $count - 1) {
                continue;
            }

            for($l = $k + 1; $l <= $count; $l++) {
                // i,j,k,l query
            }
        }
    }
}

Обратите внимание, что запросы больше не находятся в своем первоначальном порядке.

Как уже было сказано, оптимизировать это невозможнодалее, не зная запросов, которые вы выполняете.

1 голос
/ 06 июля 2010

Большая проблема заключается в том, что внутренние циклы запускаются несколько раз.Вы можете обойти это, проверив i === 1 и j === 2 внутри циклов и запустив соответствующий код, только если true.

0 голосов
/ 06 июля 2010

Микрооптимизация: используйте

++$i

вместо

$i++

и эквивалент для $ j ++, $ k ++ и $ l ++

Но что вы делаетев этих циклах: вполне возможно, что ваш запрос (база данных?) может быть изменен для полного удаления циклов ... и это будет гораздо эффективнее, чем любая микрооптимизация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...