[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация блока кода
I++
Как максимально оптимизировать конструкцию внутри цикла for, чтобы увеличить производительность?

Цикл 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 примени.

Спустя 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
Для перебора массива - он самый быстрый smile.gif

Спустя 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";
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.