Несколько вопросов по производительности

@lexander

Новичок
Несколько вопросов по производительности

Здравствуйте, у меня возникли некоторые вопросы по производительности. Помогите их решить, пожалуйста.

1. Что быстрее?
PHP:
while (list($key, $val) = each($ar))
или
PHP:
for($key = key($ar);$key; next($ar),$key = key($ar))
Как сдвинуть указатель массива на единицу влево/вправо?
next и each сдвигают указатель, но выполняют при этом лишнюю работу.

PS: Как посмотреть код стандартных функций в PHP?


2. Как выбрать одну ячейку из MySQL?

Я использую:
PHP:
$q = 'SELECT field FROM table Where field2 = 1';
$r = mysql_fetch_assoc($q);
mysql_free_result($q);
unset($q);
Возможно, есть более быстрые решения.

3. Если необходимо в переменной заменить %SOMETHING% на соответствующее значение из массива с таким же ключом, есть ли что-то быстрее strtr($what,$replase_ar);

Быстрее выбрать из базы
[SQL]SELECT * FROM table,table2 Where table.id=table2.id AND table.id IN (1,2,3)[/SQL]

или считать из файла: unserialize(fread($handle, filesize('cache.file')));

а для [SQL]SELECT * FROM table Where field = 1 AND field2 = 'abc';[/SQL]

какова скорость функции unserialize?
 

SiMM

Новичок
http://rsdn.ru/article/philosophy/Optimization.xml

> есть ли что-то быстрее strtr($what,$replase_ar);
[m]str_replace[/m] может оказаться быстрее, но не тем, что тебе нужно. А вообще - что мешает взять и сравнить?
[m]microtime[/m] в зубы и вперёд.
 

Rammstein

PHPClub::News
1) foreach специально для перебора массивов - должен быть быстрее.
2) Чтобы увеличить скорость - используй mysqli. Там есть такая штука как mysqli_prepare() + mysqli_bind_resoult()
3) SiMM ответил
4) Тут действительно, юзай microtime
 

@lexander

Новичок
1) foreach специально для перебора массивов - должен быть быстрее.
The following are also functionally identical:

PHP:
<?php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
    echo "Key: $key; Value: $value<br />\n";
}

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}
?>
 

@lexander

Новичок
Кто-нибудь знает, как посмотреть код стандартных функций в PHP?
 

DiMA

php.spb.ru
Команда форума
> 1) foreach специально для перебора массивов - должен быть быстрее.

как раз таки он должен быть тормознее всех

а наиболее быстрый, теоретически: $keys=array_keys($array); for ($i=0; $i<$keys; $i++) $array[$keys[$i]]...

> 2. Как выбрать одну ячейку из MySQL?

SELECT field FROM table Where field2 = 1
LIMIT 1

> unserialize(fread($handle, filesize('cache.file')));

есть же file_get_contents

Операция чтения, unserialize(), модификация массива (легкая) и serialize() на 5-ти метровом файле работает пару секунд при 100% нагрузке 2400 Гц проца. На мелких - быстро. Для повышения скорости записывай не сериализованные файлы, а в формате пхп-файла, чтобы просто инклюдить его, что самое быстрое (ну, запись будет подольше, чем serialize). Если перезапись файла будет при каждом чтении - только serialize, иначе при редких перезаписых выгодней пхп-формат.

В общем случае чтение из мыскля будет естественно быстрее сериализованных данных:
- не надо ничего расшифровывать
- селект запросы кешируются, что дает огромную скорость, начиная со второго селекта подряд
 

SiMM

Новичок
> Для повышения скорости записывай не сериализованные файлы, а в формате пхп-файла, чтобы просто инклюдить его, что самое быстрое (ну, запись будет подольше, чем serialize).
[m]parse_ini_file[/m] не быстрее будет?
 

DiMA

php.spb.ru
Команда форума
Никогда не использовал. Массивы обычно сложные, состяит из любых символов и т.д. К тому же обратной функции к parse_ini_file для записи нет, а если писать ее самому, так быстрее в пхп-формат писать, для последующего "бесплатного" инклюда.
 

ONK

Пассивист PHPСluba
foreach при переборе всего массива всегда будет быстрее других возможных вариантов.
 

DiMA

php.spb.ru
Команда форума
Ты абсолютно уверен? А как же копирование каждого элемента массива в дополнительную переменную $k=>$v, на что нужно выделить память.
 

Scud

Новичок
А я проверял профайлером xdebug, один и тот же алгоритм написанный на foreach, array_walk и array_map и профайлер чётко показал foreach самый быстрый.

К тому-же, если я не ошибаюсь, в PHP реализован механизм copy on write, так что если надо просто пробежаться то foreach самый раз.
 

Фанат

oncle terrible
Команда форума
У меня есть сильные подозрения в осмысленности заданных вопросов.
Я не верю в то, что озвученные проблемы - это именно передний край оптимизации.

-~{}~ 03.06.06 17:50:

Andreika, придержал бы ты коней...
 

@lexander

Новичок
Автор оригинала: Фанат
У меня есть сильные подозрения в осмысленности заданных вопросов.
Я не верю в то, что озвученные проблемы - это именно передний край оптимизации.
А кто сказал, что это передний край оптимизации? Основное уже сделано, осталось подкорректировать. Да и всё равно, хоть на малом, но можно ускорить систему...
 
Сверху