![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| NLspieler |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Для прохода по массиву с натуральными ключами от нуля до n, можно использовать такую конструкцию:
Или такую:
Что будет лучше и быстрее работать или же это дело вкуса? |
||||
|
|||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
NLspieler, Как вы думаете, foreach создали чтобы показать, какой он медленный и неудобный и тем самым призвать юзать for?
|
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Недавно встречал на форуме высказывание, что нужно юзать foreach, только если без него действительно никак не обойтись. Иначе же лучше for. Писал это кажется bars80080, а он как я заметил, х..ню не напишет. Пробовал измерить так:
Результат во всех скриптах равен нулю. Может есть аналог time() но для дольных частей секунды? Это сообщение отредактировал(а) NLspieler - 11.5.2009, 15:46 |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
Если вы не знаете как замерить работу скрипта, не пофиг ли, for или foreach?
Одинаково они примерно работают, foreach быстрее даже зачастую. Добавлено через 1 минуту и 15 секунд Угу, посмотрел, у меня foreach примерно раза в два быстрее работает. Добавлено через 2 минуты и 26 секунд Не стоит на этом зацикливаться, на кавычках, циклах и т.д., когда, например, одним кривым запросом к базе можно свести все старания на нет. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
NLspieler, правильно писать так:
mov ebx, 0 lbl: inc ebx cmp ebx,10 jnz lbl ведь это еще круче и непонятнее, чем использовать for для задач, для которых нужно юзать foreach. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
да я говорил, и буду говорить, ибо надо следовать вселенскому предначертанию вещей
нет, конечно, некоторые любят чесать правой рукой левое ухо через голову, но стоит ли специально? в пхп куча функций и вносятся они не просто так, а с целью облегчить труд кодера, заменив ряд часто выполняемых действий. при этом, коль реализации этих функций пишутся на более производительных языках, лучше использовать их, заместо самописных. то же самое касается и функций, которые имеют пересекающуюся сферу деятельности. заведомо можно сказать, что у них реализации разные, но каждая заточена под свой вариант что касается:
то это всё из области: а вы с картошкой или вареньем горчицу любите? я в своё время проверял, у меня явно выходило быстрее на for для порядковых массивов, но массивы там были не простые, а циклы были вложенные. т.е. надо смотреть в конкретной ситуации вопрос надо ли, должен возникнуть только в случае если проект уже начинает скрипеть от нагрузки а до тех пор, всё-таки лучше пользоваться в разных вариантах специально предназначенными для того функциями |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
enof, как правильно производить замер времени работы скрипта в точности до дольных частей секунды?
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
http://en.wikipedia.org/wiki/Bottleneck_(engineering) |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
http://www.php.ru/manual/function.microtime.html |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
bars80080, вы соглашаетесь с тем, что вы за for, и тут же приводите аргументы в пользу стандартных средств.
вот именно, что в свое время. Многие приводят эти тесты и сейчас в док-во слов, типа юзай одинарные кавычки, и ваша программа будет работать в два раза быстрее. Это я к тому, что многие тесты уже не актуальны. К тому же сейчас разработчики пхп наконец-то зашевелились по поводу производительности. NLspieler, эти тесты ничего не стоят, можно только примерно посмотреть, как обстоят дела. nerezus, Там про что,в двух словах? С английским у меня не очень =( |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Попробовал провести тестирование одного скриптика, оказалось, что иногда он выполняется быстрее, иногда медленние.
Иногда скорость отличается в сотни раз. |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 7 Всего: 54 |
Тестировать скрипты нужно в идеальных условиях... Интересно посмотреть на результат, если во время тестов одновременно записывается три болванки, компилируется прога в VS 2008, играет музыка, работает антивир и еще прочая лабудень, и когда работает только один сервер... За этим следить то надо!
|
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
SneG0K, Бесполезно. Убивал иксы, апач, мускул и все ненужную дребедень. Все равно разброс огромный во времени.
|
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 7 Всего: 54 |
Дык а скрипт работает с БД?
|
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
Ну речь же идет о быстродействии языковых конструкций. Зачем здесь apache, mysql, оконная система?
|
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 7 Всего: 54 |
Ну а смысл экономить на языковых конструкциях? Есть смысл оптимизировать запросы, но нет смысла оптимизировать операторы языка... Хотите производительности, цепляйте кластера!
Добавлено через 2 минуты и 4 секунды Хотите еще большей производительности - работайте на уровне железа! (Анреал) |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
Я тебе про Фому, ты мне про Ерему.
Все эти тесты ради интереса, любопытно же все-таки, когда делать нечего. По поводу этого вендузятники идут курить. Да все равно, создание этих "идеальных условий" бессмысленно.
угу, спаяй сам себе сайт. |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
enof, прочитал твою ссылку тест.
Автор утверждает, что foreach медленние чем for. ??? Может быть и правда провести собственное тестирование? А с разбросом результатов думаю можно боротся так: Пытаемся создать максимально "идеальные" условия. Проводим тест n раз. Результаты записываем, сортируем, откидываем по 40% слишком больших и слишком маленьких результатов. Из оставшихся вычисляем среднее арифметическое. |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
Следующее предложение за ссылкой тоже нужно было прочитать. Эти тесты проводились примерно после выхода php4. Насчет тестирования думал недавно, соберусь как-нибудь проведу. |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 7 Всего: 54 |
Если про сервера, то винду ф топку!!! А нагрузка на процессор? Хочешь получить больше процессорного времени - убей конкурентов!!!
Только ради интереса, в боевых условиях использовать это мозголюбство не стоит, только больше проблем возникнет |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
я про то и говорю. Как ты оконную систему в винде уберешь? никак. У меня иксы сжирают ~15%, в винде не знаю насклько оконная система прожорлива. Вот, я могу х остановить, а ты в винде хочешь не хочешь, а окошками любуйся, хоть они и не нужны. В тестах сравнивается что-то с чем-то, главное чтобы в одинаковых условиях, а какие они, впринципе не так уж и важно. да и на десктопе тоже. |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 7 Всего: 54 |
||||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Протестировал таким кодом:
Получилось, что foreach немного быстрее, 90-95% времени по сравнению с for Это сообщение отредактировал(а) NLspieler - 11.5.2009, 20:50 |
|||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
Тогда уж замерял бы в цикле что ли и среднее потом выводил.
Это сообщение отредактировал(а) enof - 11.5.2009, 20:56 |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
enof, может быть затем, что одинаковые усилия, потраченные на оптимизацию конструкций и SQL-запросов дадут разницу в выигрыше производительности в несколько тысяч раз?
Добавлено через 2 минуты и 3 секунды
Естественно на реальном приложении если мерять, т.к. никому не нужны результаты, которые не повлияют на практику. |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Пропустил через цикл, 600000 интераций. Результат ~82%
Короче, объявляю foreach бесспорным победителем. Это сообщение отредактировал(а) NLspieler - 11.5.2009, 21:15 |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
nerezus, а что вы понимаете под оптимизацией sql запросов?
Это типо, что бы они вытаскивали только нужные поля таблицы, а не все? |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
||||
|
||||
| enof |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 837 Регистрация: 23.1.2009 Где: Санкт-Петербург Репутация: 30 Всего: 35 |
ну так foreach и является той самой "функцией", облегчающей труд кодера. Или я чего-то не понимаю? |
|||
|
||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: 2 Всего: 20 |
foreach должна быть быстрее, хотя бы потому, что в ней не определяется дополнительная переменная $i для счета.
+ в for() каждый раз проверяется условие, стоящее на втором месте: for($i=0;$i<100;$i++). Если говорить о массивах - в for часто допускают ошибку: for($i=0;$i<count($array);$i++) - Получается при каждом прохождении цикла, не только проверятеся условие <, но и выполняется функция count. Все это относится к очень мелкой и преждевременной оптимизации и большой роли не играет, имхо. |
|||
|
||||
| bars80080 |
|
||||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
дык, for тоже является соответствующей функцией, созданной для облегчения труда
как же он тогда вообще считает? вот у меня вопрос тестировщикам, а вы пробовали на крупных массивах сравнивать for и foreach? к примеру, двумерный массив, содержащий строки из БД, ну хотя бы 100-10000, при этом в каждой записи 5-10 полей в том числе со строковыми элементами до 250 символов? |
||||
|
|||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: 2 Всего: 20 |
Хм. В то время как for:
А по поводу тестов: http://derekgallo.com/2007/04/19/for-vs-foreach/ Тут есть foreach, while и другие И наверное самый полный: http://www.phpbench.com/ |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
||||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Кажется, если я не ошибаюсь, foreach может пройтись и по такому массиву:
? for же этого сделать не сможет без дополнительного гемора. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
||||
|
||||
| Рыжий |
|
||||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: 2 Всего: 20 |
Нет, foreach не вводит новую переменную в php, из мануала:
Это как использование функции next()/each(), которые просто возвращают элемент массива, и перемещают указатель на следующий. |
||||
|
|||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
да причём здесь ввод дополнительной переменной? я говорю о физической памяти. вот у нас поле ячеек объёмом в 200-3000 мегабайт оперативной памяти, какие из них содержат непосредственно данные массива? неужели пхп кладёт их рядком друг за другом и ориентируется всего по двум флагам начала и конца, двигая их как в регистре? да я не уверен, что даже данные одного элемента массива занимают упорядоченный набор байт. полюбому для массива составлен список адресов и вводится итерационная переменная на каком-то глубоком уровне, C или ещё ниже, которая перебирает все адреса и извлекает через них данные
|
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
Где-где, а на Винграде потока столь феерического бреда не ожидал.
Давайте ещё в очередной раз подискутируем насчёт print vs echo. |
|||
|
||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: 2 Всего: 20 |
Дык я о том же - foreach не объявляет переменную в php окружении, насколько мне известно много переменных в php влияют на скорость выполнения.
угу, что-то мы далеко в лес зашли |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |