Вот решил немного побаловаться на тему что быстрей... Делаю шапку, т.е. подключаю класс, создаю объект(какой не важно, главное что этот класс наследует класс My_SQL), произвожу выборку... Код (Text): [php]include "Classes/Calendar_class.php"; $r = new Calendar('Monday','24','1'); $res = $r-> select('B_Booker','id,day,time','month=? and year=? and boardroom=?','ORDER BY day')-> send_data('4','2009','1');[/php] Далее проверяю какой вариант обработки запроса быстрее: Код (Text): $s = microtime(true); for ($i = 0; $i < 100000; $i++) { test_row($res); $i++; } printf('row1: %.5f<br />', microtime(true) - $s); $s = microtime(true); for ($i = 0; $i < 100000; $i++) { test_for($res); $i++; } printf('for1: %.5f<br />', microtime(true) - $s); function test_row($res) { $rows=mysql_num_rows($res); for($i=0;$i<$rows;$i++) { $value[]=mysql_fetch_assoc($res); } } function test_for($res) { for ($value=array(); $row=mysql_fetch_assoc($res);){ $value[]=$row; }; } результат: Код (Text): row1: 0.49916 for1: 0.16592 все класс, 'for' форэвэр доволен. Вот только черт дернул проверить а сколько же средняя скорость запроса: Код (Text): for ($i = 0; $i < 100000; $i++) { $k += test_row2($res); $i++; } printf('row2: %.10f<br />', $k/100000); for ($i = 0; $i < 100000; $i++) { $k += test_for2($res); $i++; } printf('for2: %.10f<br />', $k/100000); function test_row2($res) { $s = microtime(true); $rows=mysql_num_rows($res); for($i=0;$i<$rows;$i++) { $value[]=mysql_fetch_assoc($res); } return microtime(true) - $s; } function test_for2($res) { $s = microtime(true); for ($value=array(); $row=mysql_fetch_assoc($res);){ $value[]=$row; }; return microtime(true) - $s; } А вот результат получаеться обратный... первый метод лучше: Код (Text): row2: 0.0000061569 for2: 0.0000097015 :shock: Получаеться так: Код (Text): row1: 0.49916 for1: 0.16592 row2: 0.0000061569 for2: 0.0000097015 :shock: :shock: :shock: Может ктото сказать почему результат противоположный получился? Или где я ошибся?
результаты запроса база кеширует (попробуйте в первом тесте поменять тесты местами). во втором случае это не так отразилось на резултаты первого метода. P.S. PDO рулит. PHP: <? $db = new PDO('mysql:host=localhost;dbname=testdb'); foreach($db->query('SELECT name, colour, calories FROM fruit ORDER BY name') as $row) { print $row['name'] . "\t"; print $row['colour'] . "\t"; print $row['calories'] . "\n"; }
zzzVolkzzz PHP: <?php for ($i = 0; $i < 100000; $i++) { $k += test_row2($res); $i++; } printf('row2: %.10f<br />', $k/100000); for ($i = 0; $i < 100000; $i++) { $k += test_for2($res); $i++; } printf('for2: %.10f<br />', $k/100000); ?> Во-первых, оба цикла сработают 50 000 раз, а не 100 000. Второе. Оба теста запускал опять же так, как как и выложил? За один прогон оба цикла?
За один прогон я пробывал и пароми по 2 и все 4 теста. А что такое PDO, кинте пож ссылку чтоб знать куда копать. Пропробывал поменять местами тесты, получилось: PHP: for1: 0.18495 row1: 0.52688 row2: 0.0000081297 for2: 0.0000120527 Т.е. ничего не изменилось... А почему тест прогониться только 50 000???[/code]
Господа, прошу прощение, вся фишка была в скрипте((( Я забыл обнулить константу времени после второго цикла, вот и получилось что средняя скорость запроса: (предыдущая + сумма 100 000 нового теста)/100 000((( вот новый код PHP: <?php for ($i = 0, $k = 0/* раньше здесь $k не было */; $i < 100000; $i++) { $k += test_row2($res); $i++; } printf('row2: %.10f<br />', $k/100000); for ($i = 0,$k = 0/* раньше здесь $k не было */; $i < 100000; $i++) { $k += test_for2($res); $i++; } printf('for2:   %.10f<br />', $k/100000); ?> результат: Код (Text): for1: 0.20168 row1: 0.54892 for2: 0.0000046696 row2: 0.0000071406 А насчет ссылки про PDO я бы не отказался! )))
к чему и вёл… PHP: <?php for ($i = 0; $i < 100000; $i++) { // при проходе увеличиваем $i // функция $i++; // ещё раз увеличиваем } ?> таким образом в цикле получается $i += 2; и проходов не 100 000, а 50 000
PHP: <?php for ($i = 0; $i < 100000; $i+=2) { // при проходе увеличиваем $i // функция } ?> не вариант?
Вариант, только это просто не надо) Я когда писал скрипт сдуру 2 раза инкрементировал, а надо только 1 раз.