Да у Your в принципе код медленный хотя бы потому что там на каждой итерации вызываются функции, а вызов даже пустой функции это уже несколько микросекунд. Просто xdebug вносит огромный диссонанс во время выполнения, и если он включен, пользоваться microtime(true) весьма опрометчиво в принципе. Такие вещи надо оговаривать. Ну и говорить что за комп у кого. Может Your делал свой тест на машине с Атом процессором и с включенным xdebug. Вот какие у меня получаются результаты, если не требуется сохранять ключи: Код (PHP): function showtime($totals) { foreach ($totals as $algo => $tryes) { foreach ($tryes as $tk => $total) { //частенько попадаются странные значения 0.(0), попробую их отсеять foreach ($total as $k => $v) { if ($v < 0.000000001) { unset($total[$k]); } } printf("$algo попытка " . ($tk + 1) . ": минимальное %.10f мкс, среднее %.10f мкс<br>\n", min($total) * 1000000, array_sum($total) * 1000000 / count($total)); } } } $totals = []; /// GLOBAL ITER START $globaliter = 3; for ($globalitercounter = 0; $globalitercounter < $globaliter; $globalitercounter++) { $array = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $start = 0.0; $stop = 0.0; $iter = 1000; $itercounter = 0; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'Felix'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $start = microtime(true); //ALGO START for ($i = 0, $size = sizeof($mass); $i < $size; $i++) { if (isset($mass[$i])) { $tmp = array_keys($mass, $mass[$i]); if (($tmp_size = sizeof($tmp)) > 1) { for ($j = 0; $j < $tmp_size; $j++) { unset ($mass[$tmp[$j]]); } } } } //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'id'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $start = microtime(true); //ALGO START $c = array_count_values($mass); $r = []; foreach ($c as $k => $v) { if ($v < 2) { $r[] = $k; } } //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'Your'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $newArray = []; $start = microtime(true); //ALGO START array_walk_recursive($mass, function ($key, $value) use (&$mass, &$newArray) { $keys = array_keys($mass, $key); if (1 === sizeof($keys)) { $newArray[$keys[0]] = $key; } }); //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// } /// GLOBAL ITER END showtime($totals); Добавлено спустя 2 минуты 26 секунд: а еще у меня случаются квантования минимального времени... хз как с этим бороться.
Блин, ды причем тут хдебаг и у кого какая машина? Есть онлайн сервис. Без хдебага. На одном и том же сервере в среднем два скрипта показывают стабильную разницу во времени. Вот и все. Не усложняй, приплетая проблемы, которых не было А то можно еще сказать, что во время тестов нельзя в игры играть, а то нагрузка на железо скачет и результаты будут не корректные. Еще нельзя комп из окна выбрасывать во время теста. Капитанишь, Игорь З.Ы. Закинь в свой тест код Исандро. Он работает по похожему принципу, но медленней моего гораздо. Хотя у тебя, вроде скорость не проседает от array_count_values. Неужели array_diff настолько тяжел даже для одного значения?
Эти вещи надо писать в дисклеймере каждый раз. Ящитаю. И тестировать в инете на сервисах - это тоже вопрос тонкай. Не хотеть тестировать на сервисах. Добавлено спустя 4 минуты 49 секунд: У YSandro код жутко зависимый от каких-то неясных факторов. Мистика. Разброс минимумов жуткий просто. Хотя в среднем - стабильно. Код (PHP): function showtime($totals) { foreach ($totals as $algo => $tryes) { foreach ($tryes as $tk => $total) { //частенько попадаются странные значения 0.(0), попробую их отсеять foreach ($total as $k => $v) { if ($v < 0.000000001) { unset($total[$k]); } } printf("$algo попытка " . ($tk + 1) . ": минимальное %.10f мкс, среднее %.10f мкс<br>\n", min($total) * 1000000, array_sum($total) * 1000000 / count($total)); } } } $totals = []; /// GLOBAL ITER START $globaliter = 3; for ($globalitercounter = 0; $globalitercounter < $globaliter; $globalitercounter++) { $array = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $start = 0.0; $stop = 0.0; $iter = 1000; $itercounter = 0; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'Felix'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $start = microtime(true); //ALGO START for ($i = 0, $size = sizeof($mass); $i < $size; $i++) { if (isset($mass[$i])) { $tmp = array_keys($mass, $mass[$i]); if (($tmp_size = sizeof($tmp)) > 1) { for ($j = 0; $j < $tmp_size; $j++) { unset ($mass[$tmp[$j]]); } } } } //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'id'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $start = microtime(true); //ALGO START $c = array_count_values($mass); $r = []; foreach ($c as $k => $v) { if ($v < 2) { $r[] = $k; } } //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'Your'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $newArray = []; $start = microtime(true); //ALGO START array_walk_recursive($mass, function ($key, $value) use (&$mass, &$newArray) { $keys = array_keys($mass, $key); if (1 === sizeof($keys)) { $newArray[$keys[0]] = $key; } }); //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// $algo = 'YSandro'; $total = []; for ($itercounter = 0; $itercounter < $iter; $itercounter++) { //ITER START $mass = $array; $newArray = []; $start = microtime(true); //ALGO START $countArr = array_count_values($mass); foreach ($countArr as $key=>$value) { if($value > 1){ $mass = array_diff($mass, array($key)); } } //ALGO END $stop = microtime(true); $total[] = $stop - $start; //ITER END } $totals[$algo][] = $total; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// } /// GLOBAL ITER END showtime($totals);
Сервачок есть, но в нэт не светит пока. Да и шума от него много, круглые сутки крутить. Попугай пугается
К слову, они пугаются не только в "свободное время". Мой может играть с какой-нибудь блестяшкой у меня на столе, уронить ее на паркет со звоном, а потом с визгом начать летать по комнате, испугавшись этого звона. А так, очень прикольные зверушки.
Хм... Код (PHP): $array=array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $countArr = array_count_values($array); foreach ($countArr as $key=>$value) { if($value > 1){ $array = array_diff($array, array($key)); } } 0.00030708312988281 секунд 0.00034904479980469 секунд 0.00064301490783691 секунд 0.00074386596679688 секунд Код (PHP): $array=array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); for ($i = 0, $size = sizeof($array); $i<$size; $i++){ if (isset($array[$i])){ $tmp = array_keys($array,$array[$i]); if (($tmp_size = sizeof($tmp))>1){ for($j = 0; $j<$tmp_size; $j++){ unset ($array[$tmp[$j]]); } } } } 4.3153762817383E-5 секунд - и туда сюда прыгает бывает и до 6 взлет... Код (PHP): $array=array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $newArray=array(); array_walk_recursive($array,function($key,$value) use (&$array,&$newArray) { $arr=array_keys($array,$key); if(1===sizeof($arr)) { $newArray[$arr[0]]=$key; } }); $array=$newArray; 0.00016903877258301 секунд 0.00017404556274414 секунд 0.00017380714416504 секунд 0.00018501281738281 секунд Вообще как удобнее так и пишите думаю тут еще способы есть...
4.3153762817383E-5 секунд это 0,00004. Через printf выводишь? В любом случае и на твоей машине результаты сравнимы с таковыми на сервисе.
Что-то сегодня несколько раз вспоминал о задачке. Зашёл на форум, а тут продолжение. Вместо затратной строки $mass2 = array_diff($mass2, array($key)); поставил заполнение нового массива, получилось в 1.8 раз быстрей. Но на самом деле я раньше ошибся в расчётах. Мой код быстрей, чем у Феликса Код (PHP): <?php echo '<br>==YSandro==<br>'; $tstart = microtime(true); for ($x = 0; $x < 1000; $x++) { $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $countArr = array_count_values($mass); $newArr = array(); foreach ($countArr as $key=>$value) { if($value == 1){ $newArr[] = $key; } } } $tend = microtime(true); echo number_format($tend-$tstart,'6',',','').' sec. '; print_r($newArr); echo '<br>==Fell-x27==<br>'; $tstart = microtime(true); for ($x = 0; $x < 1000; $x++) { $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); for ($i = 0, $size = sizeof($mass); $i<$size; $i++){ if (isset($mass[$i])){ $tmp = array_keys($mass,$mass[$i]); if (($tmp_size = sizeof($tmp))>1){ for($j = 0; $j<$tmp_size; $j++){ unset ($mass[$tmp[$j]]); } } } } } $tend = microtime(true); echo number_format($tend-$tstart,'6',',','').' sec. '; print_r($mass); На http://www.compileonline.com/execute_php_online.php выводит Код (Text): ==YSandro== 0,005159 sec. Array ( [0] => 2 [1] => 3 [2] => 60 ) ==Fell-x27== 0,019869 sec. Array ( [2] => 2 [3] => 3 [16] => 60 )
Нет. Просто сейчас ты выпилил array_diff. Без него уже Игорь выкладывал код, да, так оч шустро. Но с дифом беда беда. Код (PHP): <?php echo '<br>==YSandro==<br>'; $tstart = microtime(true); for ($x = 0; $x < 1000; $x++) { $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $countArr = array_count_values($mass); foreach ($countArr as $key=>$value) { if($value > 1){ $mass = array_diff($mass, array($key)); } } } $tend = microtime(true); echo number_format($tend-$tstart,'6',',','').' sec. '; print_r($mass); echo '<br>==Fell-x27==<br>'; $tstart = microtime(true); for ($x = 0; $x < 1000; $x++) { $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); for ($i = 0, $size = sizeof($mass); $i<$size; $i++){ if (isset($mass[$i])){ $tmp = array_keys($mass,$mass[$i]); if (($tmp_size = sizeof($tmp))>1){ for($j = 0; $j<$tmp_size; $j++){ unset ($mass[$tmp[$j]]); } } } } } $tend = microtime(true); echo number_format($tend-$tstart,'6',',','').' sec. '; print_r($mass); ==YSandro== 0,133811 sec. Array ( [2] => 2 [3] => 3 [16] => 60 ) ==Fell-x27== 0,019587 sec. Array ( [2] => 2 [3] => 3 [16] => 60 )
Да херню наделали, ТСу нужно было вообще вот это: Код (PHP): $mass=array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $mass=array_unique($mass); Array ( [0] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [7] => 6 [11] => 20 [12] => 30 [13] => 40 [14] => 50 [16] => 60 )
Читай внимательнее. ТСу надо было, чтобы удалялись не дубликаты записей, а все дублирующиеся множества. Полностью.
Вон оно, что михалыч =) Код (PHP): $mass=array('40 41 42 44 ' , '39 44 43 45 45 39 45 45' , ' 41 44'); echo'<pre>'; $mass=array_map(function($value,$key=' ') { return array_filter( array_unique(explode($key,$value)),function($value) { return $value; } ); },$mass); print_r($mass); echo'</pre>'; Array ( [0] => Array ( [0] => 40 [1] => 41 [2] => 42 [3] => 44 ) [1] => Array ( [0] => 39 [1] => 44 [2] => 43 [3] => 45 ) [2] => Array ( [1] => 41 [2] => 44 ) ) Хотя конечно стоило бы сделать массив 1, а не чтобы еще ключи массива, делать массивом, либо применять регулярки.
Чуть не по теме вопрос. Может у кого была такая проблема. Выносишь код в отдельный файл, съезжает таблица CSS и как ни странно в мозиле все нормально , а в опере и хроме чудеса начинают творится. Выносной файл подключаю так. <div class="left_menu"> <?php include($_SERVER['DOCUMENT_ROOT'].'/ks/views/left_menu/left_menu.php'); ?> </div>
Скажу лишь, что ты просто с путями CSS что-то накосячил. PHP никак не влияет на работу браузеров и отображение страницы. Он просто текст генерит.
Это то да, Я сам удивлен. Короче вынес еще в файл <div class="left_menu"> </div> , все везде заработало. Мне кажется это глюки браузеров хром и опера, поскольку если бы Я с путями напутал, тогда и в мозиле не работало, но там все отлично как до выноски так и после.
Перестановки кода у тебя не браузеры с толку сбивают. Они саму страницу так или иначе у тебя ломали. А к ошибкам у всех браузеров свое отношение. Кто-то строг, кто-то пытается понять "что хотел сказать автор" и сам ошибки правит по мере сил. Смотреть надо не на то, чем отличается то, что браузер сейчас нарисовал от того, что было, а исходный текст страницы, какой был и какой стал. Ошибка там.
Новая проблемка. CSS уже и так и сяк крутил. В опере хроме позиционирование одно, в мозиле разница в 1px , в IE 7 вообще -15px ))). Вся проблема заключалась в том что два блока <div> вынес в отдельные файлы так по правильному, а потом подключил как обычно через includ. Интереса ради вставил без выноски и все сразу одинаково во всех браузерах и да же IE 7 заработало. Что за чудеса) Код с выноской блоков <div> в отдельные файлы: <body> <div class="glaw_ramka"> <div class="main_menu"><img src="images/main_menu.gif"></div> <?php include($_SERVER['DOCUMENT_ROOT'].'/ks/views/left_menu/left_menu.php'); ?> <?php include($_SERVER['DOCUMENT_ROOT'].'/ks/views/pages/index.php'); ?> </div> </body>
в один проход Код (PHP): $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40); $uniq = $trash = array(); foreach($mass as $v) { if (isset($trash[$v])) continue; if (!isset($uniq[$v])) { $uniq[$v]=1; } else { $trash[$v]=1; unset($uniq[$v]); } }