Цикл for в данном случае используется для измерения производительности.
get_info находится в конце блока IF, при 1000000 итераций время исполнения: 0.872242927551 сек.
меняем $current_data = 'get_data';
Замеряем, получаем: 0.184409856796 сек.
Какие будут предложения?
P.S $current_data может иметь значения которых нет в блоке IF.
PSS. $current_data - динамическая переменная в неё разные команды скажем так, записываются, и она меняется. Это тут я для наглядности упростил.
<?php
$current_data = 'get_info';
$time_start_script = microtime(1);
for($i=0;$i<1000000;$i++)
{
if($current_data === 'get_data')
{
// Некоторый код
}
else if($current_data === 'get_bla')
{
// Некоторый код
}
else if($current_data === 'get_hla')
{
// Некоторый код
}
else if($current_data === 'set_info')
{
// Некоторый код
}
else if($current_data === 'set_info_path')
{
// Некоторый код
}
else if($current_data === 'current_conf')
{
// Некоторый код
}
else if($current_data === 'last_conf')
{
// Некоторый код
}
else if($current_data === 'change_loc')
{
// Некоторый код
}
else if($current_data === 'izometric_calc')
{
// Некоторый код
}
else if($current_data === 'base_com')
{
// Некоторый код
}
else if($current_data === 'set_nav')
{
// Некоторый код
}
else if($current_data === 'get_info')
{
// Некоторый код
}
else if($current_data === 'push_int')
{
// Некоторый код
}
}
echo microtime(1) - $time_start_script;
?>
Спустя 1 час, 19 минут, 44 секунды (28.11.2011 - 10:11) Rand написал(а):
Переписать на Си. Здесь оптимизировать нечего.
Спустя 5 часов, 16 минут, 47 секунд (28.11.2011 - 15:27) Renden написал(а):
Вплане красоты думаю switch - case будет симпатичнее, в плане оптимизации хз, мб тоже чуть быстрее будет)))
Спустя 4 минуты, 32 секунды (28.11.2011 - 15:32) inpost написал(а):
Свитч, я читал, что медленнее.
Спустя 19 минут, 18 секунд (28.11.2011 - 15:51) maximka787 написал(а):
I++
загони в массив и foreach примени.
загони в массив и foreach примени.
Спустя 2 минуты, 43 секунды (28.11.2011 - 15:54) I++ написал(а):
Цитата (maximka787 @ 28.11.2011 - 16:51) |
I++ загони в массив и foreach примени. |
Пример кода можно?
Спустя 1 час, 18 минут, 33 секунды (28.11.2011 - 17:12) Игорь_Vasinsky написал(а):
Цитата |
$current_data = 'get_info'; |
откуда у $current_data другие значения в цикле? красивей в switch-case, не думаю что прям так сильно в скорости потеряешь.. в тысячных долях.
а вообще самое быстрое freach, но не вижу как его у тя применить.
Спустя 1 час, 17 минут, 31 секунда (28.11.2011 - 18:30) I++ написал(а):
Цитата |
красивей в switch-case. |
В данном случае красота не важна, код для себя делаю, а не для масс. Эффективность важнее красоты в данном случае. А свитч медленнее if-else раз эдак в 6 :D
Вобщем копался, ломал голову, неплохой вариант есть это создание анонимных функций, среднее зло между производительностью в 0.872242927551 и 0.184409856796, получается 0,60 примерно.
$current_data = 'get_info';
$current_data();
function get_info($data)
{
// Некоторый код.
}
Но выигрышь был бы, если у меня огромный if-else был...
Цитата |
откуда у $current_data другие значения в цикле? |
$current_data - сюда записывается команда с сокета, и в зависимости от команды нужно выполнять определенный кусок кода. Т.е $current_data не статичная переменная а меняется, так же в неё могут попасть данные которые отсуствуют в блоке if-else в этом случае команда игнорируется и не приводит к проблемам.
Спустя 2 минуты, 11 секунд (28.11.2011 - 18:32) Winston написал(а):
Цитата (Игорь_Vasinsky @ 28.11.2011 - 16:12) |
а вообще самое быстрое freach |
Насколько я знаю, foreach самый медленный цикл в php.
Спустя 19 минут, 47 секунд (28.11.2011 - 18:52) inpost написал(а):
Winston
Для перебора массива - он самый быстрый
Для перебора массива - он самый быстрый
Спустя 35 минут, 56 секунд (28.11.2011 - 19:28) I++ написал(а):
Цитата (inpost @ 28.11.2011 - 19:52) |
Winston Для перебора массива - он самый быстрый :) |
:rolleyes:
0.00411581993103 sec
$arr = range(0, 1000);
$time_start_script = microtime(1);
for($i=0;$i<10000;$i++)
{
do
{
$pos = key($arr);
if($pos !== NULL)
unset($arr[$pos]);
else
break;
}while(1);
}
echo microtime(1) - $time_start_script."\n";
0.480713844299 sec
$arr = range(0, 1000);
$time_start_script = microtime(1);
for($i=0;$i<10000;$i++)
{
foreach($arr as $val)
{
}
}
echo microtime(1) - $time_start_script."\n";
Колоссальная разница неправда ли?
После unset($arr[$pos]); можно вытягивать значение массива.
Самое интересное, что unset быстрее next :D Указатель при использовании любой из функций (unset, next) смещается, только есть одно но, unset удаляет значение в массиве по ключу. Если не требуется гонять массив по новой, очень экономит память.
Тестирование для FOR 0.814769029617
$arr = range(0, 1000);
$time_start_script = microtime(1);
for($i=0;$i<10000;$i++)
{
$arr_count = count($arr);
for($b=0;$b<$arr_count;$b++)
{
}
}
echo microtime(1) - $time_start_script."\n";