2010-08-22 2 views
4

Я сделал некоторые профилирования на сайте и обнаружил, что вызов strtolower неожиданно наступил.Почему производительность PHP strtolower настолько различна?

Контекст


function __autoload($class_name) { 
    require_once('app/model/' . strtolower($class_name) . '.php'); 
} 

И результат
_0.0092 -> ___ автозагрузку() C: \ ххх \ config.php: 0_
0,0093 -> strtolower() C: \ xxx \ config.php: 77
0,0101 -> require-once (C: \ xxx.php) C: \ xxx \ config.php: 77
Я видел это в нескольких местах в файле трассировки.

Затем я попробовал функцию в следующем контексте


for($i=0;$i<100;$i++) { 
    strtolower('SomeStRIng' . $i) 
} 

И результат был
0,0026 -> strtolower() C: \ ххх \ index.php: 53
0.0027 -> strtolower() C: \ xxx \ index.php: 53
0,0027 -> strtolower() C: \ ххх \ index.php: 53
0,0027 -> strtolower() C: \ ххх \ index.php: 53

Существует заметная разница между двумя , Конечно, это не большой, но я все еще смущен.

+0

Префиксные строки кода с 4 пробелами. Или просто выделите блок и нажмите кнопку формата на панели инструментов (с 1 и 0). –

+3

Я считаю, что это ошибка измерения вашего инструмента профилирования. –

+2

Я не вижу, как такая микро-оптимизация полезна. http://www.codinghorror.com/blog/2005/01/micro-optimization-and-meatballs.html – cbednarski

ответ

5

У вас слишком маленькие тесты, на слишком маленьких данных. Вы никогда не получите согласованные данные, так как другие системные факторы (например, скорость/загрузка процессора) будут намного больше.

Ваш первый тест связан с диском. Опускание случая (надеюсь, разумно) короткой струны по существу мгновенно или, по крайней мере, измеряется в микросекундах. Нахождение диска для поиска/загрузки/разбора файла займет порядка миллисекунд. Вы пытаетесь обнаружить разницу в чем-то, где часть, которую вы не беспокоите, занимает в 1000 раз дольше. т.е.: strtolower overhead - ошибка округления.

Ваш второй тест, будучи чисто cpu/memory bound, также слишком короток, чтобы быть практичным. Вы не можете быть уверены, что выполнение 100 конкатенаций строк (и соответствующего распределения памяти) не приведет к подавлению фактического нижнего индекса. Лучшим тестом было бы предустановить ряд строк с примесями (несколько сотен или тысяч из них), а затем циклически перебирать этот массив и strtolower в seuqnce. Таким образом, вы устранили как можно больше накладных/нерелевантных кодов, и, надеюсь, получите более согласованные данные.

+0

Большое спасибо. Я знаю, что я вообще не проводил научных испытаний, но я видел, что разница была последовательной. Я попытаюсь схватить то, что вы сказали в сообщении выше, и понять это. – Anders

0

Какой профилировщик вы использовали? XDebug?

Я подозреваю, что это проблема с профилировщиком, так как вы демонстрируете значительную разницу. Посмотрите, если это профили по-разному ...

function __autoload($class_name) { 
    $file=strtolower($class_name); 
    require_once('app/model/' . $file . '.php'); 
} 
+0

Использование Xdebug. Делать это по-своему, это уменьшилось примерно до половины. 0.0003-0.0005. Я не знаю, как работает парсер. Может быть, это немного более загружено из-за того, что это больше для разбора и сохранения в памяти? – Anders

+0

Что? Внесите ли переменную код быстрее? – raveren

+0

Raverene: Мне нужно, чтобы он нуждался в более научном бенчмаркинге, чем в моем тесте. Это было согласовано для всех вызовов strtolower, хотя, я думаю, это как-то изменило – Anders

Смежные вопросы