Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Что быстрее? Сравнение функций


Автор: Gold Dragon 28.2.2013, 14:02
Уважаемые друзья. Предлагаю в эту тему складывать тесты разных функций. Например, я провожу разные тесты и готов делиться с другими какие функции быстрее, а какие полные тормоза.. На этом форуме много тем, где идёт сравнение функций.. В общем много источников.

В конечном итоге это многим поможет

Предлагаю публиковать сообщения в следующем формате:
- какие функции сравниваются
- PHP-код самого теста
- результаты
- версия PHP


ps
Модераторы, если посчитаете эту тему важно, то прошу вас закрепить её

Автор: Gold Dragon 28.2.2013, 14:22
foreach и for

тест
Код

// Формируем тестовый массив
$array = array();
for($i=0; $i < 1000000; $i++){
    $array[] = 'qqqqqq';
}
$len = sizeof($array);

// Измеряем foreach
$a = microtime(true);
foreach($array as $value){
    $x = $value;
}
$aa = round((microtime(true) - $a), 5);

// Измеряем for
$b = microtime(true);
for($i=0; $i < $len; $i++){
    $x = $array[$i];
}
$bb = round((microtime(true) - $b), 5);

// Выводим результат
echo 'foreach: ' . $aa .'<br>for: '. $bb;
echo '<hr>'. $bb/$aa;


Результат: foreach быстрее for в 1,6-2,3 раза

PHP: 5.4.8

Автор: MoLeX 28.2.2013, 14:31
тест не полный, надо минимум протестировать на разных массивах + разных платформах.

Добавлено через 48 секунд
А так идея очень хорошая, буду карму поднимать тем кто тесты будет запиливать  smile 

Автор: Gold Dragon 28.2.2013, 14:51
ну полным тест никогда не будет, всегда есть что добавить smile да и тяжело ассоциативный массив через for перегонять  smile А что касается платформ, то не думаю что будет заметная разница, абсолютные величины может и будут различаться, а относительные думаю не очень.. В любом случае, любой желающий сможет взять и дополнить ....

Автор: Aliance 28.2.2013, 15:29
Цитата(Gold Dragon @  28.2.2013,  15:51 Найти цитируемый пост)
да и тяжело ассоциативный массив через for перегонять 

почему же? легко:
Код

$myArray = array('one' => '1111', 'two' => '2222', 'three' => '3333');
for (reset($myArray); current($myArray); next($myArray){ 
    printf('<p>%s => %s</p>', key($myArray), current($myArray));
} 


или через while
Код

$myArray = array('one' => '1111', 'two' => '2222', 'three' => '3333');
reset($myArray);
while (list($key, $value) = each($myArray)) {
    printf('<p>%s => %s</p>', $key, $value);
}


Правда в этой схеме бывают и проколы:
Цитата(php.net)

<?php 
$arr = array(1,2,3,4,5,6,7,8,9); 

foreach($arr as $key=>$value) 
{ 
    unset($arr[$key + 1]); 
    echo $value . PHP_EOL; 
} 
?> 
Output: 
1 2 3 4 5 6 7 8 9 

<?php 
$arr = array(1,2,3,4,5,6,7,8,9); 

while (list($key, $value) = each($arr)) 
{ 
    unset($arr[$key + 1]); 
    echo $value . PHP_EOL; 
} 
?> 
Output: 
1 3 5 7 9 

Автор: Fortop 28.2.2013, 16:30
Для минусующих идиотов.
Показываю

foreach: 0.05929
for: 0.05159

и корректная проверка чистых циклов, а не разных способов доступа к элементам массива

Код

<?php
// Формируем тестовый массив
$array = array();
for($i=0; $i < 1000000; $i++){
    $array[] = 'qqqqqq';
}
$len = sizeof($array);
// Измеряем foreach
$a = microtime(true);
foreach($array as $k => $value){
    $x = $array[$k];
}
$aa = round((microtime(true) - $a), 5);
// Измеряем for
$b = microtime(true);
for($i=0; $i < $len; $i++){
    $x = $array[$i];
}
$bb = round((microtime(true) - $b), 5);
// Выводим результат
echo 'foreach: ' . $aa .'<br>for: '. $bb;
echo '<hr>'. $bb/$aa;

Автор: Gold Dragon 28.2.2013, 18:01
Кстати, вот интересный маленький тест

Тест 1
Код

foreach($array as $value){
    $x = $value;
}


Тест 2
Код

foreach($array as $key =>$value){
    $x = $value;
}

Тест 3
Код

foreach($array as $key =>$value){
    $x = $array[$key];
}


Тест 1

PHP 5.2.17
0.07474
0.07473
0.07506
0.07484
0.07394

PHP 5.3.18
0.15548
0.15511
0.15592
0.15582
0.15935

PHP 5.4.8

0.1182
0.11921
0.12467
0.12193
0.12079

Тест 2

PHP 5.2.17
0.09935
0.09818
0.10013
0.09956
0.10091

PHP 5.3.18
0.2153
0.20556
0.21216
0.20949
0.20348

PHP 5.4.8
0.18541
0.17971
0.17943
0.17828
0.19942

Тест 3

PHP 5.2.17
0.15455
0.15168
0.15176
0.15243
0.1521

PHP 5.3.18
0.26169
0.2611
0.26417
0.25977
0.25846

PHP 5.4.8
0.18531
0.18904
0.18663
0.18702
0.18608

Автор: baldina 1.3.2013, 17:09
1. for и foreach это теплон с мягким, чего их сравнивать..
2. ввиду п.1 имеет смысл сравнивать решение не конструкций языка, а определенных задач разными способами
3. видимо надо учесть, что часть функционала, находящаяся во встроенных функциях (конструкциях) будет быстрее, чем интерпретируемый код. однако исполняющая система в пхп чесьма эффективна, так что в случае кеширования разница будет копеечная. если кеширование не используется, то производительность не является узким местом. 
В общем я не вижу пользы от этой темы.

Автор: DropSQL 2.5.2013, 17:42
Меня тоже заинтересовал вопрос.
Насколько часто вы сталкиваетесь с проблемами в сторости работы foreach или for?
Лично у меня никогда не стояла проблема с разницей производительности for, foreach, while etc.
По этому не вижу смысла сравнивать настолько незначимые мелочи.

Автор: marioadm 6.5.2014, 00:38
 smile 
Цитата(Gold Dragon @  28.2.2013,  18:01 Найти цитируемый пост)
PHP 5.4.8

0.1182
0.11921
0.12467
0.12193
0.12079



 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)