#31 2009.05.06 03:02

JInn
Участник
Откуда: Север нашей Родины
Зарегистрирован: 2008.11.18
Сообщений: 120
Карма: 2
Профиль Веб-сайт

Re: Тесты производительности

Вот еще вопрос. Вывод текста с переменными. Есть три варианта.

1 - echo "text $aaa text";
2 - echo 'text '.$aaa.' text';
3 - echo "text ".$aaa." text";

В первом варианте интерпретатор должен проверять весь текст на $ и пробел, что и замедляет процесс. Это типа ищет переменную.
Во втором варианте проверка не идет (процесс быстрее), но используется конкатенация (даже две), что по идее должно замедлять процесс.
Третий вариант из области антивариантов и "Так писать не надо", так что его можно не иметь ввиду.
Собственно вопрос в том, какой из вариантов, 1 или 2, работает быстрее? Для чистоты эксперимента текст должен быть в двух вариантах. Небольшим - до 50 символов и большим - до 300 символов. Это связано с первым вариантом, там потому что поиск идет. В принципе может кто то и так знает результат?


Как все таки сложно быть ботом...

Неактивен

#32 2009.05.06 11:53

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

ну здесь этот вопрос рассматривался http://wapinet.ru/textbook/speed.htm
правда было это очень давно и, вероятно , на php4. Чуть позже попробую потестить на php5.3

Неактивен

#33 2009.05.06 18:47

JInn
Участник
Откуда: Север нашей Родины
Зарегистрирован: 2008.11.18
Сообщений: 120
Карма: 2
Профиль Веб-сайт

Re: Тесты производительности

Посмотрел... Скажем так - я в шоке... К тому, что увидел могу добавить, что
$x="test ".$test." test ".$test." test ".$test;
быстрее на 10% чем
$x="test ".$test." test ".$test." test ".$test."";
то есть если последнюю переменную не закрывать, то это хорошо. Не смог правда проверить с одинарными кавычками


Как все таки сложно быть ботом...

Неактивен

#34 2009.09.04 16:23

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

PHP 5.3.1
30 тысяч проходов

Код:

1
span style="color: #0000BB"><?php// 0.5504// 0.5523// 0.5499// 0.5622// 0.5541$a = 1;switch($a){ case 2: break; case 3: break; default: break;}// 0.4459// 0.4513// 0.4421// 0.4456// 0.4510$a = 1;if($a == 2){}else if($a == 3){}else{}?>

Добавлено спустя   7 минут  18 секунд:

JInn написал:

Посмотрел... Скажем так - я в шоке... К тому, что увидел могу добавить, что
$x="test ".$test." test ".$test." test ".$test;
быстрее на 10% чем
$x="test ".$test." test ".$test." test ".$test."";
то есть если последнюю переменную не закрывать, то это хорошо. Не смог правда проверить с одинарными кавычками

а что здесь шокирующего? нафига делать эту лишнюю конкатенацию с пустой строкой?

Неактивен

#35 2009.09.05 11:50

Akdmeh
Участник
Откуда: Киев и рядом;)
Зарегистрирован: 2008.11.30
Сообщений: 257
Карма: 9
Профиль Веб-сайт

Re: Тесты производительности

Интересно, но как по мне, ради этого не стоит избегать switch, ведь там возможно без break; подключить сразу несколько условий, да и визуально кода немного меньше)


Желание стать программистом из-за того, что вам нравляться компьютерные игры-это все равно, что желание стать гинекологом из-за того, что вам нравиться сексwink

Неактивен

#36 2009.09.05 11:57

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

Akdmeh, да, зачастую switch удобнее. Но если скорость критически важный параметр, то приходится жертвовать удобством. Я на этот switch обратил внимание когда профилировал Gmanager. Оказалось что одна совсем ничем не примечательная функция определения расширения файла, занимает приличную долю ремени. Тем более что вызывается несколько раз в цикле. Пришлось отказаться от switch и переписать на if / elseif / else. Немного, но прирост производительности это дало.

Неактивен

#37 2009.09.05 13:52

Akdmeh
Участник
Откуда: Киев и рядом;)
Зарегистрирован: 2008.11.30
Сообщений: 257
Карма: 9
Профиль Веб-сайт

Re: Тесты производительности

Конечно, в циклах это бывает важно.
Кст, сравни у себя mb_substr и iconv_substr - интересно что у тебя выйдет.


Желание стать программистом из-за того, что вам нравляться компьютерные игры-это все равно, что желание стать гинекологом из-за того, что вам нравиться сексwink

Неактивен

#38 2009.09.05 14:06

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

ок smile
Кстати, сейчас искал самый быстрый способ прохода по папке, без подпапок. Вероятно это достигается следующим способом:

Код:

1
span style="color: #0000BB"><?php$arr = array_diff(scandir('directory/', 0), array('.', '..'));?>

Пробовал в т.ч. новые итераторы, но с ними как минимум в 3 раза медленнее.

Неактивен

#39 2009.09.05 14:17

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

iconv_substr быстрее примерно на треть.
100000 проходов

Код:

1
span style="color: #0000BB"><?php// 3.5349// 3.6812// 3.6436$a = "";iconv_substr($a, 0, 6, "UTF-8");// 5.7895// 5.8432// 5.8222$a = "";mb_substr($a, 0, 6, "UTF-8");?>

Такая же ситуация, если переменной $a присвоить какую-нибудь длинную строку.
Нужно отметить, что многое зависит от кодировки. Если у mb_substr стоит какая-нибудь однобайтовая кодировка, а у iconv_substr мультибайтовая, то естественно mb_substr выиграет.

Неактивен

#40 2009.11.06 22:31

AND
Участник
Зарегистрирован: 2009.01.23
Сообщений: 87
Карма: 11
Профиль Веб-сайт

Re: Тесты производительности

MySQLi. Запрос с подготовленным выражением и без него.

Код:

1
span style="color: #0000BB"><?php$db = new Mysqli('localhost', 'root', '', 'test') or die('Can not connect to MySQL');$prepare = true;$integer = 1234567890;$string = 'dgjmnvyuoplhgdenjhtrmnfqskytkgoyhjkdfmdigjewruytgrehguhksjgijerpoiwhgjeijgewyewyhlnjkbgsyigbvydbwg';$start = microtime(true); if($prepare) { $stmt = $db->prepare('INSERT INTO test (`integer`, `string`) VALUES (?, ?)'); $stmt->bind_param('is', $integer, $string); for($i = 0; $i < 10000; $i++) { $stmt->execute(); } $stmt->close(); // 10000 проходов // 5.50247 // 5.46265 // 5.59152 // 1 проход // 0.00141 // 0.00125 // 0.00172}else { for($i = 0; $i < 10000; $i++) { $db->query('INSERT INTO test (`integer`, `string`) VALUES ('.intval($integer).', "'.$db->real_escape_string($string).'")'); } // 10000 проходов // 6.11369 // 6.08014 // 6.16883 // 1 проход // 0.00082 // 0.00106 // 0.00067}echo round(microtime(true) - $start, 5);$db->close();?>

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.022 s