Перш за все, я розумію, що в 90% додатків різниця в продуктивності абсолютно не має значення, але мені просто потрібно знати, яка конструкція швидша. Це і ...
Інформація, наявна на даний момент у них в мережі, є заплутаною. Багато людей кажуть, що передбачити це погано, але технічно це повинно бути швидшим, оскільки, як передбачається, спростити написання обходу масиву за допомогою ітераторів. Ітератори, які, мабуть, швидше, але в PHP також, мабуть, мертві повільно (чи це не річ PHP?). Я говорю про функції масиву: next () prev () reset () і т.д. добре, якщо вони навіть є функціями, а не однією з тих функцій мови PHP, які виглядають як функції.
Щоб трохи звузити це : мені не цікаво проїжджати масиви кроками, що перевищують 1 (також немає негативних кроків, тобто зворотна ітерація). Мене також не цікавить проїзд до і від довільних точок, всього 0 до довжини. Я також не бачу маніпулювання масивами з більш ніж 1000 клавішами, що відбуваються на регулярній основі, але я бачу, як масив проходить багато разів в логіці програми! Також, що стосується операцій, то в основному це лише маніпуляція зі струнами та відлуння.
Ось кілька довідкових сайтів:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Що я чую всюди:
foreach
повільно, а значить,for
/while
швидше- PHP
foreach
копіює масив, який він повторює; щоб зробити це швидше, вам потрібно використовувати посилання - такий код: швидше, ніж a
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Ось моя проблема. Я написав цей тестовий сценарій: http://pastebin.com/1ZgK07US і незалежно від того, скільки разів я запускаю сценарій, я отримую щось подібне:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Коротко:
foreach
швидше, ніжforeach
з посиланнямforeach
швидше, ніжfor
foreach
швидше, ніжfor
для хеш-таблиці
Може хтось пояснить?
- Чи я щось роблю не так?
- Чи дійсно зміна довідки PHP прореагує на зміну? Я маю на увазі, чому б не скопіювати це, якщо перейти за посиланням?
- Який еквівалентний код ітератора для оператора foreach; Я бачив декількох в мережі, але кожен раз, коли я перевіряю їх, час закінчується; Я також протестував кілька простих ітераторних конструкцій, але ніколи не отримує навіть гідних результатів - чи просто ітератори масиву в PHP просто жахливі?
- Чи існують більш швидкі способи / методи / конструкції для ітерації через масив, відмінний від FOR / FOREACH (і WHILE)?
PHP версії 5.3.0
Редагувати: Відповісти З допомогою людей, які я тут змогла зібрати відповіді на всі питання. Я підсумую їх тут:
- "Хіба я щось не так роблю?" Здається, що консенсус такий: так, я не можу використовувати ехо в тестах. Особисто я все ще не бачу, як відлуння - це якась функція з випадковим часом виконання або як будь-яка інша функція якось інакше відрізняється - це і здатність цього сценарію просто генерувати точно такі самі результати просування, як усе важко пояснити, хоч просто "ти використовуєш ехо" (ну що я маю використовувати). Однак, я визнаю, тест слід робити з чимось кращим; хоча ідеальний компроміс не приходить до тями.
- "Чи справді важлива посилання на PHP foreach? Я маю на увазі, чому б не скопіювати її, якщо перейти за посиланням?" ircmaxell показує, що так, подальше тестування, мабуть, доводить, що в більшості випадків посилання має бути швидшим - хоча, враховуючи мій вище фрагмент коду, це, безумовно, не означає все. Я погоджуюсь, що це питання, мабуть, занадто неінтуїтивне, щоб набридати на такому рівні, і для цього потрібно щось екстремальне, наприклад, розкладання, щоб фактично визначити, що краще для кожної ситуації.
- "Який еквівалентний код ітератора для оператора foreach; я бачив декілька в мережі, але кожен раз, коли я перевіряю їх, час закінчується; я також протестував кілька простих конструкцій ітератора, але ніколи не отримую навіть гідних результатів - просто жахливі ітератори масиву в PHP? " ircmaxell надав відповідь нижче; хоча код може бути дійсним лише для версії PHP> = 5
- "Чи існують більш швидкі способи / методи / конструкції для ітерації через масив, відмінний від FOR / FOREACH (і WHILE)?" Дякую, іди до Гордона за відповідь. Використання нових типів даних у PHP5 повинно забезпечити або підвищення продуктивності, або збільшення пам’яті (будь-який з них може бути бажаним залежно від вашої ситуації). Незважаючи на те, що багато нових типів масивів не мають кращої швидкості, ніж array (), splpriorityqueue і splobjectstorage здаються значно швидшими. Посилання, надане Гордоном: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Дякую всім, хто намагався допомогти.
Я, швидше за все, дотримуватимуся передбачення (нереференційна версія) для будь-якого простого обходу.