Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость работы str_replace, Насущный вопрос обхода массива 
V
    Опции темы
KEM
Дата 17.3.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 28.1.2005

Репутация: нет
Всего: 2



В ходе очередных кодо-исправление возник такой вопрос!
Почему столь значительные разницы при выполнении казалось бы одинаковых операций?  smile 

Код

 for ($i=0; $i<500000;$i++){
    $bl_ar = str_replace(array("\r\n"," ",chr(9)),"",$bl_ar);
}
// Done: 6.978 sek


for ($i=0; $i<500000;$i++){
   while (list($ind, $val) = each($bl_ar)) $bl_ar[$ind] = str_replace(array("\r\n"," ",chr(9)),"",$val);
}
// Done: 1.187 sek


for ($i=0; $i<500000;$i++){
   foreach($bl_ar as $ind => $val){
     $bl_ar[$ind] =  str_replace(array("\r\n"," ",chr(9)),"",$val);
   }
}
// Done: 17.671 sek


Выходит вид while (list($ind, $val) = each($bl_ar)) на и более быстродействующий для обхода массива ?
--------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм...
PM MAIL   Вверх
Feldmarschall
Дата 17.3.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



В реальной жизни разница незаметна.

И при чем здесь "Скорость работы str_replace", хотелось бы знать.
PM   Вверх
merge
Дата 17.3.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.3.2007

Репутация: нет
Всего: 1



ты пробовал в разных php скриптах? всмысле не в одном? можнет он после первого вызова как-то оптимизировал массив?
PM MAIL   Вверх
awers
Дата 17.3.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



мало того что ворох орфографических ошибок, так и кроме str_replace функций не видешь?
PM MAIL WWW ICQ Skype   Вверх
KEM
Дата 17.3.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 28.1.2005

Репутация: нет
Всего: 2



Данные куски кода пробовал как вместе, так и раздельно, результат примерно одинаковый. 
Меня интересует почему вариант  
Код

 while (list($ind, $val) = each($bl_ar)) $bl_ar[$ind] = str_replace(array("\r\n"," ",chr(9)),"",$val);

является в  17 раз более быстродейстующим, чем
Код

 foreach($bl_ar as $ind => $val){
     $bl_ar[$ind] =  str_replace(array("\r\n"," ",chr(9)),"",$val);
   }

 

awers, вопрос нужно учиться читать внимательнее, а для флуда есть другие разделы smile 



Это сообщение отредактировал(а) KEM - 17.3.2008, 16:14
--------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм...
PM MAIL   Вверх
Feldmarschall
Дата 17.3.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(KEM @  17.3.2008,  16:11 Найти цитируемый пост)
Меня интересует почему вариант  

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

В РНР есть миллион мест, где можно задаться точно таким же впросом. сравнивать скорость обработки строк в одинарных и в двойных кавычках, например.
Но тратить на это свое время врядли кто-то будет. Так что, если тебе так уж любопытно - смотри в исходниках.
PM   Вверх
SelenIT
Дата 17.3.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



KEM, а Вы уверены, что эти варианты на второй и последующих итерациях делают одно и то же? ;)

hint: найдите 1 отличие между конструкцией с while(each(...)), показавшей такой "феноменальный" результат, и подобной ей конструкцией в мануале, приведенной в качестве эквивалентной для foreach-а.

Это сообщение отредактировал(а) SelenIT - 17.3.2008, 16:57


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
KEM
Дата 17.3.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 28.1.2005

Репутация: нет
Всего: 2



Feldmarschall, ну почему же, с практической точки зрения давольно важно ели нужно максимально быстро обойти большие массивы данных.
SelenIT, конечно не одно и то же )
Для чистоты эксперимента,  если каждый элемент целочисленного массива увеличивать на 1, то вариант foreach при 5000 итераций явно отстаёт примерно в 22 раза!
Вот и весь академический интерес... smile 
--------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм...
PM MAIL   Вверх
SelenIT
Дата 17.3.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



KEM, еще бы ему не отставать. Он ведь честно проходит весь массив все полмиллиона раз. А вайл с листом несколько халявит...  smile 


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
awers
Дата 17.3.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Цитата(KEM @  17.3.2008,  17:11 Найти цитируемый пост)
awers, вопрос нужно учиться читать внимательнее, а для флуда есть другие разделы  

Да, написано "Скорость работы str_replace", разве не так?

KEM, на phpclub.ru была статья по оптимизации. Там рассказано почему и что быстрее и в каких случаях стоит применять тот или иной вариант.
PM MAIL WWW ICQ Skype   Вверх
Canarat
Дата 17.3.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 11.3.2008
Где: Каспий

Репутация: 5
Всего: 5



KEM
Если не изменяет память, foreach копирует массив в памяти, именно с этим связаны его удобные свойства для программиста и некоторая медленность. Обрати внимание на синтаксис остальных циклов, и становится видно, что foreach необходимо совершать дополнительные операции с массивом(копирование, вычисление размеров) чтобы предоставить такой синтаксис.

PM MAIL   Вверх
SelenIT
Дата 17.3.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



KEM, подсказка "в лоб": каково быстродействие
Код

for ($i=0; $i<500000;$i++){
   reset($bl_ar); // внимательно читайте мануал! ;)
   while (list($ind, $val) = each($bl_ar)) $bl_ar[$ind] = str_replace(array("\r\n"," ",chr(9)),"",$val);
}

и чем это (как и foreach) отличается от изначального "казалось бы" самого быстрого варианта?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
mishaSL
Дата 17.3.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



KEM, для полноты теста предлагаю свой вариант. Думаю он будет самый быстрый (если главное - это скорость):
Код

function testR(&$item, $key)
{
    $item = str_replace(array("\r\n"," ",chr(9)),"",$item);
}
array_walk($bl_ar, 'testR');



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Feldmarschall
Дата 17.3.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(KEM @  17.3.2008,  17:06 Найти цитируемый пост)
с практической точки зрения давольно важно ели нужно максимально быстро обойти большие массивы данных.

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

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

И вот если твоему приложению надо максимально быстро обойти большие массивы, то думать надо не о том, как ловить микросекунды, а о том, чтобы этих массивов в приложении не было.
PM   Вверх
KEM
  Дата 18.3.2008, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 28.1.2005

Репутация: нет
Всего: 2



mishaSL, Ваш вариант оказался наиболее быстрым =)

SelenIT,   "reset($bl_ar); " да действительно косяк )

Feldmarschall, очень интересно было бы заслушать Ваш вариант на тему обработки списка e-mail из текстового файла, к примеру выборки по доменам?

awers, статью обязательно поищу и почитаю, т.к. вопрос очень интересует!

Подведу небольшой итог умозаключений в наглядной форме  smile 

Код

1 Done: 8.1106939315796
2 Done: 7.2879480838776
3 Done: 5.132677936554


Код

<?php

set_time_limit(90);

function tm_clc($st,$sp){
    $st = explode(" ", $st);
    $st = $st[1] + $st[0];
    $sp = explode(" ", $sp);
    $sp = $sp[1] + $sp[0];
    return $sp - $st;
}

function set_array(){
    for($i=0; $i<=2000000; $i++){
        $bl_ar[] = 1;
    }
    return $bl_ar;
}

################################################################################
$bl_ar = set_array();
$start = microtime();

 foreach($bl_ar as $ind => $val){
     $bl_ar[$ind] =  $val + 1;
   }

$stop = microtime();
echo "<br>1 Done: ".tm_clc($start,$stop)."<br>";
################################################################################
$bl_ar = set_array();
$start = microtime();

   while (list($ind, $val) = each($bl_ar)) $bl_ar[$ind] = $val + 1;

$stop = microtime();
echo "<br>2 Done: ".tm_clc($start,$stop)."<br>";
################################################################################
$bl_ar = set_array();
function testR(&$item, $key){ $item = $item + 1; }

$start = microtime();

   array_walk($bl_ar, 'testR');

$stop = microtime();
echo "<br>3 Done: ".tm_clc($start,$stop)."<br>";
################################################################################
?>


Господа...  smile 


Это сообщение отредактировал(а) KEM - 18.3.2008, 01:13
--------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.