Там скорость совершенно не играет роли - 4 наносекунды, или 5 наносекунд Если писать в твое стиле, то сделал чтото типа слеудющего. Хотя обычно я не поленился бы и разложил на 4 файла. Код (PHP): <?php if ($argc < 2) { die ('You should set function and type of arrays'); } define('ARRAY_LEN', 5000); define('STR_LEN' , 6); function genWord ($len) { $symb = array_merge(range('A', 'Z'), range('0', '9')); $word = ''; for($i = $len; $i--;) { $word .= $symb[array_rand($symb)]; } return $word; } function genArray ($len, $numKeys = 1) { $arr = array(); for ($i = $len; $i--;) { $str = 'Abc_' . $i; if ($numKeys) { $array[] = $str; } else { $array[genWord(STR_LEN)] = $str; } } return $array; } $in_array = ($argv[1] == 'in_array'); $numKeys = ($argv[2] == 'num'); $array = genArray(ARRAY_LEN, $numKeys); if ($in_array) { $s = microtime(1); for($i = ARRAY_LEN; $i--;) { in_array('Abc_' . $i, $array); } $e = microtime(1); } else { $s = microtime(1); for($i = ARRAY_LEN; $i--;) { array_search('Abc_' . $i, $array); } $e = microtime(1); } $time = $e-$s; $funcName = $in_array ? 'in_array ' : 'array_search'; $keysName = $numKeys ? 'numbers' : 'words '; echo "$keysName\t $funcName\t $time"; ?> Код (Text): shock@shock:~$ php -f in_array.php in_array num numbers in_array 1.56898784637 numbers in_array 1.46682596207 numbers in_array 1.54345297813 shock@shock:~$ php -f in_array.php array_search num numbers array_search 1.58310008049 numbers array_search 1.56693696976 numbers array_search 1.57468390465 shock@shock:~$ php -f in_array.php in_array word words in_array 1.46571493149 words in_array 1.50736808777 words in_array 1.54798603058 shock@shock:~$ php -f in_array.php array_search word words array_search 1.54046916962 words array_search 1.53344988823 words array_search 1.54208493233 in_array оказался быстрее
Кстати, Psih, откуда у тебя таки результаты? Даже учитывая то, что ты не обратил внимание на те тесты, которые я показывал на предыдущей страницы и поставив $this->$k в заранее невыгодное положение, у меня на твоем, не измененном, коде результат совершенно другой: Код (Text): Test with $this->$k: 1.7555880547 Test with call_user_func: 3.7753160000 Test with switch: 2.7043220997 И если увеличить MAX в десять раз: Код (Text): Test with $this->$k: 16.8400199413 Test with call_user_func: 36.0149941444 Test with switch: 26.4321908951
Результаты у меня: Код (Text): shock@shock:~$ php -f call.php Test with $this->$k: 0.5787761211 Test with call_user_func: 1.1570560932 Test with switch: 0.6206638813 Test with __call: 1.0854020119 Если MAX увеличить в десять раз: Код (Text): shock@shock:~$ php -f call.php Test with $this->$k: 5.4993469715 Test with call_user_func: 11.3275890350 Test with switch: 5.9209101200 Test with __call: 10.7685289383 Еще раз обращаю внимание, что я не вносил никаких правок в код, использовал в точности тот, что ты привел. PHP 5.2.6
У меня тоже call_user_func в аутсайдерах Код (Text): Test with $this->$k: 0.3663179874 Test with call_user_func: 0.8560650349 Test with switch: 0.4225261211 Код (Text): Test with $this->$k: 3.7014639378 Test with call_user_func: 8.3807721138 Test with switch: 4.3606371880 php 5.2.10, debian lenny
Ну если верить hardinfo: Код (Text): -Computer- Processor : 2x Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz Memory : 2061MB (599MB used) Operating System : Linux From Scratch 9.04
Mr.M.I.T., именно, что буду. Потому что у тебя каша и нету никакого, даже самого примитивного разделения. Где не надо - ты написал руками (40 ключей писал руками, хотя их можно было сгенерировать функцией - капец). А где критична каждая миллисекунда - ты использовал call_user_func, которая в два раза херит результаты тестов, о чем выше доказали я и Sergey89. При чем, обрати внимание, в этом тесте я специально продублировал следующее место, потому что это критичный к времени момент и я не хотел делать проверку if ($in_array) { в цикле Код (PHP): <?php if ($in_array) { $s = microtime(1); for($i = ARRAY_LEN; $i--;) { in_array('Abc_' . $i, $array); } $e = microtime(1); } else { $s = microtime(1); for($i = ARRAY_LEN; $i--;) { array_search('Abc_' . $i, $array); } $e = microtime(1); } $time = $e-$s; А на счет того, у кого более читабельный код - пускай рассудит кто-то со стороны.
TheShock я в шоке =))) какая нафиг разница? на сравнение это вообще никак не влияет не умею я их генерировать, мне ручками проще написать и ничё от этого не изменится А то что ты константу передаёшь в аргументе,вот жесть то. и коду у тебя в 2 раза больше получилось и обрати внивание что хоть ты и всё АПтЕмизировал, времени на поиск у тебя ушло больше хотя комп у тебя в 2 раза мощьнее моего делай выводы
Mr.M.I.T., хорошо, попробуем твой тест на моем компе. Во-первых, мне пришлось добавить error_reporting(E_ALL ^ E_NOTICE); в начало скрипта, потому что в php.ini у меня стоит E_ALL: Код (Text): Notice: Undefined index: func in /home/shock/Web/www.tests.lh/htdocs/speed/test.php on line 3 Notice: Undefined index: type in /home/shock/Web/www.tests.lh/htdocs/speed/test.php on line 4 Еще я отключил запись в лог в таймере, заменой в конфиге 1 на 0 Код (Text): Array type:Numbers; Function: in_array, Итоговое Время => 1.75832390785 Array type:Numbers; Function: in_array, Итоговое Время => 1.76603889465 Array type:Numbers; Function: in_array, Итоговое Время => 1.75931596756 Array type:Numbers; Function: array_search, Итоговое Время => 1.7408490181 Array type:Numbers; Function: array_search, Итоговое Время => 1.75348114967 Array type:Numbers; Function: array_search, Итоговое Время => 1.7569539547 Array type:Words; Function: in_array, Итоговое Время => 1.7763068676 Array type:Words; Function: in_array, Итоговое Время => 1.74286103249 Array type:Words; Function: in_array, Итоговое Время => 1.73543787003 Array type:Words; Function: array_search, Итоговое Время => 1.93225193024 Array type:Words; Function: array_search, Итоговое Время => 1.73943305016 Array type:Words; Function: array_search, Итоговое Время => 1.82167601585 Во-первых, видно увеличение времени. Во-вторых непонятен столь нестабильный результат при "Array type:Words; Function: array_search". Проверял раз 15 - очень прыгает. Думаю, это тоже причина для сомнений. Ну и есть разница. На вычисления не должно влиять ничего. Потому что так виднее разница в процентном соотношении. А не только в том - есть разница, или нет. И да, in_array таки быстрее, что вполне логично.
Данный тест показывает влияние не непосредственного вызова функции, а через переменную, или с помощью call_user_func. Согласно его результатам вызов функции с помощью call_user_func может до 3 раз замедлить выполнение скрипта, а также достаточно нестабильный, из чего следует, что его нельзя использовать для проведения тестов, т.к. он может сильно повлиять на результаты. Рекомендуется использовать вызов функции через напрямую [is_int($arg)] или через переменную [$func($arg)]. Влияние на результат теста в таком случае минимально PHP: <?php $func = 'is_int'; $s = microtime(1); for ($i=100000; $i--;) { /* * 0.171620845795 * 0.14718079567 * 0.122843027115 * 0.147436141968 * 0.153021097183 */ // call_user_func($func, $i); /* * 0.0564048290253 * 0.0572369098663 * 0.056524991891 * 0.0511071681976 * 0.0577621459961 */ // $func($i); /* * 0.0525500774384 * 0.0531620979309 * 0.053619146347 * 0.0523669719696 * 0.0508480072021 */ // is_int($i); } $e = microtime(1); echo $e-$s; ?>
TheShock Такие результаты из-за того, что я в Zend Studio по F5 запускал )) Ошибку понял и результаты поправлю Mr.M.I.T. Ты уж извини, но твои тесты действительно сложно читаются. Я ни в один даже не вникал, потому что тупо за 10-15 секунд не понял, что там происходит. Зато потом пост TheSchock с переписанным тестом сразу был понятен даже при очень беглом взгляде. Все в топике тесты всегда красиво оформляют, следуй и ты той же практике. Иначе придётся удалить на самом деле их, потому что они портят всё впечатление. Можно сказать что это требование, поскольку топик всё таки мой и курируется мной же. Вообще, народ, соблюдаем правила приличия и обсуждаем конструктивно. Постить явный код на коленке абы как написанный - портить свою же карму.
та ну вас. вот. Зы. у меня как это не логично, быстрее array_search, даже с использованием прямого вызова, как это объяснить? и вообще долго у тебя выволняется, хотя комп мощьнее намного моего Зыы. всё хорошо читается, тем более если читать 20 строчек
Mr.M.I.T. Ещё раз говорю, я запускал из-под Zend Studio прямо, что сильно сказалось (я бы сказал раз так в 20) на скорости выполнения. В преть буду тестировать на сервере в консоли.
значит нельзя твоим результатам верить Последний нужный мне тест и мне плевать если вам не нравится код. Впринципе это нужно лично мне, могу вообще не публиковать... нужно выяснить насколько быстрее вызов обычной функции вызова метода класса, что быстрее статика или нет PHP: <? include_once "timer.class.php"; function GenStaticClass(){ $res='<? class GenStaticClass {'; for($i=0;$i<1000;$i++){ $res.="\r\n"; $res.='static function GenStaticClass_'.$i.'(){ return true; }'; $res.="\r\n"; } $res.='}?>'; return $res; } function GenClass(){ $res='<? class GenClass {'; for($i=0;$i<1000;$i++){ $res.="\r\n"; $res.='function GenClass_'.$i.'(){ return true; }'; $res.="\r\n"; } $res.='}?>'; return $res; } function GenFunction(){ $res='<?'; for($i=0;$i<1000;$i++){ $res.="\r\n"; $res.='function GenFunction_'.$i.'(){ return true; }'; $res.="\r\n"; } $res.='?>'; return $res; } print "<pre>"; $_GET['type']=!$_GET['type']?"GenClass":"Gen".$_GET['type']; if(!function_exists($_GET['type'])) die("Func not found"); if(!is_file($file="data/{$_GET['type']}.ch.php")){ file_put_contents($file,$_GET['type']()); print "File '{$_GET['type']}' Created, Refresh page\r\n"; }else{ include $file; if(!class_exists($_GET['type'])){ Timer::Run("main"); for($i=0;$i<1000;$i++){ call_user_func($_GET['type']."_".$i); } }else{ $class=new $_GET['type'](); Timer::Run("main"); for($i=0;$i<1000;$i++){ call_user_func(array($class,$_GET['type']."_".$i)); } } print Timer::End("main","","Type:{$_GET['type']}, Time = {time}\r\n"); } print "</pre>"; ?> Вызов обычной функции ненамного быстрее вызова нестатического метода класса, статика тормозит
Mr.M.I.T., капец у тебя подход. Можно без обфускатора коммерческие проекты в паблик выкладывать - все-равно никто нихрена не поймет. А результаты тестов у меня вполне корректны.
md5 vs hash PHP: <?php define('MAX', 5000000); $time = microtime(true); for ($i = MAX; --$i;) { md5('test'.$i.'addf'.$i.$i); } $time = microtime(true) - $time; echo 'md5 : ', number_format($time, 10, '.', ''); $time = microtime(true); for ($i = MAX; --$i;) { hash('md5', 'test'.$i.'addf'.$i.$i); } $time = microtime(true) - $time; echo 'hash: ', number_format($time, 10, '.', ''); Результат: Код (Text): md5 : 5.9605150223 hash: 7.0120978355 md5 слегка шустрее
Очередное сравнение строк. Предыстория Мне очень приятны двойные кавычки. Чисто стилистически я считаю двойные кавычки более красивыми, нежели одинарные. В результате чего я решил провести простейший эксперимент, в котором выяснял: оправданно ли использовать двойные кавычвы заместо одинарных только красоты ради? Итак, несколько тестов. Тест 1 PHP: <?php $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { 'Hello, World'; } //------------------------------------ echo (microtime(true) - $start); //------------------------------------ $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { "Hello, World"; } //------------------------------------ echo "\n".(microtime(true) - $start); ?> Результаты: Код (Text): C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.19712400436401 0.19821381568909 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.20402193069458 0.19852519035339 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.19652104377747 0.19737601280212 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.19618701934814 0.19513487815857 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.1964099407196 0.19552683830261 Выводы: На данном этапе значительных замедлений не наблюдается, кроме того, в некоторых случаях второе оказываются ЧУУУТОЧКУ быстрее. Тестируем дальше. Тест 2 PHP: <?php // Какая-то переменная $hello = 'Hello, World'; $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { 'Тут будет конкатенация с '.$hello; } //------------------------------------ echo (microtime(true) - $start); //------------------------------------ $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { "Тут будет конкатенация с $hello"; } //------------------------------------ echo "\n".(microtime(true) - $start); ?> Результаты Код (Text): C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.39401197433472 0.58210802078247 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.40310096740723 0.6143741607666 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.39017391204834 0.58400988578796 Выводы: Двойные кавычки явно успупают по скорости обычной конкатенации. Тест 3 PHP: <?php // Какая-то переменная $hello = 'Hello, World'; $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { 'Тут будет конкатенация с '.$hello; } //------------------------------------ echo (microtime(true) - $start); //------------------------------------ $start = microtime(true); // ---------------------------------- for($i = 0; $i <= 1000000; $i++) { "Тут будет конкатенация с ".$hello; } //------------------------------------ echo "\n".(microtime(true) - $start); ?> Результаты Код (Text): C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.39318585395813 0.38473200798035 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.39034605026245 0.38453221321106 C:\Documents and Settings\Apple>php -f E:\htdocs\index.php 0.39049100875854 0.39710903167725 Выводы Опять, как мы видим, двойные кавычки порой показывают лучший результат ИТОГИ Двойные кавычки, вопреки мнению, которое я где-то читал, не являются тормознутыми по отношению к одиночным. При использовании их для обычных строк разницу в результате мы не чувствуем, но в случае, когда мы помещаем в строку переменную, она в разы уступает конкатенированной строке, обрамленной одинарными кавычками. Для меня этот тест очень важен, поскольку мне нравятся двойные кавычки, правда я не знаю, насколько рационально с точки зрения других программистов будет делать конкатенацию переменных с такими строками, если их можно заключить прямо в них, но по результатам теста я для себя выбор сделал, и я им очень доволен, поскольку мне не прийдется отказываться от того, что мне полюбилось.
Если я не ошибаюсь вывод противоречит результатам: ничья, +одинарныйе, ничья. В чем довольство не понятно. Однозначно двойные хуже - потому что они парсятся, а одинарные нет. Ну это касаемо быстродействия. Но это до поры до времени. Лучше посчитай при каком количестве конкатенаций двойные перестают уступать одинарным.