php большой объект / производительность цикла - PullRequest
0 голосов
/ 16 июня 2011

В настоящее время я пытаюсь найти решение моей текущей проблемы.

Предоставляя следующий код:

$array = array();
for($a=0;$a!=1000;$a++) {
    $std = new \stdClass();
    $array[] = $std;
    $count = count($array);
    for($i=0;$i!=$count;$i++);
}

PHP выполнит сценарий за 0,052025079727173 секунд

Дача:

$array = array();
for($a=0;$a!=100000;$a++) {
    $std = new \stdClass();
    $array[] = $std;
    $count = count($array);
    for($i=0;$i!=$count;$i++);
}

Занимает около 3,0082960128784 секунд.

Дано:

$array = array();
for($a=0;$a!=100000;$a++) {
    $std = new \stdClass();
    $array[] = $std;
    $count = count($array);
    //for($i=0;$i!=$count;$i++);
}

Работает на 0,3171501159668.

Теперь я понимаю, чтоЯ зацикливаюсь на высоких скоростях, и я не рискнул сильно углубиться в эту область.

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

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

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

Что касается производительности, PHP не так быстр, как, скажем, C-код или ассемблер. Но это ни к чему не приведет.

Таким образом, выполнение многих итераций всегда требует времени. На любом языке. У вас их много, так что для этого нужно время. Так что не делайте петли просто для удовольствия, а на самом деле чего-то достигните;).

1 голос
/ 16 июня 2011

Эта проблема хорошо решена и формально известна в кругах информатики как обозначение "большой О". Вот ссылка на статью, описывающую нотацию Big-O. На данный момент ваше значение Big-O является экспоненциальным из-за вложенного / встроенного цикла внутри этого большего цикла.

Я должен отметить, что то, что вы делаете, не является неправильным, и PHP оснащен возможностью обрабатывать большие объемы данных, однако, как отметил Coding Freak, у вас может не хватить памяти. Я не знаю контекста того, что вы пытаетесь сделать, но, возможно, подумайте о том, чтобы выполнять свои операции «по мере необходимости», это немного улучшит вашу производительность, так как вы не будете инициализировать / устанавливать / изменять весь блок данных, если, конечно, вы не пытаетесь выполнить какую-то большую пакетную операцию (я имею в виду время загрузки страницы здесь, и если вы делаете большую пакетную операцию, которая происходит только один раз в день, беспокоиться гораздо меньше о).

Возможно, вы захотите рассмотреть другой способ управления своими вычислениями, хотя, поскольку вы на самом деле не поставили цель, которую вы хотели бы достичь, я довольно ограничен в возможности предлагать решения.

Это очень незначительный боковой комментарий, но когда вы делаете для циклов, не делайте проверку «i! = 1000», делайте «i <1000» таким образом, если по какой-то причине ваша переменная приращения перепрыгивает через 1000, вы не будет в конечном итоге с бесконечным циклом. Как я уже сказал, очень незначительный комментарий - в контексте вашего кода это не обязательно, но также не является лучшим из методов, поскольку это может привести к ошибкам. </p>

С уважением,

H

0 голосов
/ 16 июня 2011

Эта строка не нужна:

$count = count($array);

Вы должны знать, что такое количество массивов, вам не нужно пересчитывать это каждый раз, когда вы делаете цикл. Попробуйте заменить это и посмотрите, улучшится ли производительность.

НТН.

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