Огромное снижение производительности при доступе к объекту в ассоциативном массиве PHP

Я вижу огромное снижение производительности (командная строка) Сценарий PHP, вызванный простым присвоением (увеличение во время выполнения с 0,8 ~ 0,9 секунды к 29.x секунды).

Сценарий сначала выбирает много данных из базы данных MySQL и создает объекты различных пользовательских классов. После этой выборки (php теперь использует приблизительно 500 МБ RAM) я циклично выполняю массив приблизительно 3'500 Sample объекты, каждый из которых имеет ассоциативный массив (размер приблизительно 100 записей) как одно из его свойств. Этот массив содержит Value объекты, которые являются маленькими объектами с двумя свойствами и ключами, являются целыми числами, меньшими, чем 6'000. Это - то, где я наткнулся на проблему, см. этот код:

foreach ($samples as $id => $s) {    # $s is now a 'Sample' object
    $values = $s->values();          # $values is an array of 'Value' objects

    if (isset($values[$match_id])) {
        $num_tested++;
        # $val = $values[$match_id];     # contains a 'Value' object
        # $val = &$values[...]; -> the loop never ends (!)
    }
}

Отметьте что прокомментированная строка. Если я выполняю код, как это появляется здесь, этот блок выполнения приблизительно для 0,8 к 0,9 секундам. Если я некомментирую эту одну строку, блок работает в течение почти 30 секунд. Я нашел, что, если массив неассоциативен (он только содержит последовательные ключи от 0 приблизительно до 100) время выполнения только увеличивает до 1,8 ~ 1,9 секунды.
Кажется, что это происходит из-за непоследовательных ключей массива, которые я использую, но с другой стороны почему производительность уже не уменьшается путем вызова isset($values[$match_id])? Существует ли обходное решение для этого, или я должен жить с этим?

Выполняя PHP 5.3.0, Механизм Зенда v2.3.0, Сервер Mac OS X 10.6.2

6
задан Charles 24 December 2012 в 00:05
поделиться

2 ответа

Если вы работаете в версии 5.3, изучите новые структуры данных Spl. Они могут дать значительный прирост производительности для больших коллекций, как показано здесь и здесь . Кроме того, немного сложно сказать, что может быть причиной проблемы. Вы пробовали использовать xdebug или Zend_Debugger , чтобы получить более подробную информацию?

3
ответ дан 17 December 2019 в 07:05
поделиться

Попробуйте заменить $ val = $ values ​​[$ match_id] (назначение копией) на $ val = & $ values ​​[$ match_id] ( назначение по ссылке) и посмотрите, работает ли он лучше.

1
ответ дан 17 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: