PHP Benchmarks
Изучение производительности PHP-скриптов
Одна страница
Распечатать
. Редактировалось 1 раз, последний — #1
Как известно, я помешан на производительности и периодически тестирую разные аспекты языков программирования с этой точки зрения. Результаты буду выкладывать в эту тему. Если есть идеи, что еще можно померить, пишите.
Ребята, давайте жить спокойно!
. Редактировалось 1 раз, последний — #2
Сегодня решил проверить, остается ли верным утверждение, что for быстрее foreach, в PHP 7 (впервые с этим утверждением я столкнулся во времена PHP4 на сайте PHPClub). Как выяснилось, разница несущественна и находится в пределах погрешности измерений. Более того, в разных измерениях получались разные результаты: иногда быстрее оказывался for, иногда — foreach.
Вот результаты, полученные на моем компьютере:
1 испытание:
For exec time: 13.21497797966
Foreach exec time: 13.658958911896
2 испытание:
For exec time: 13.949849128723
Foreach exec time: 13.773871898651
3 испытание:
For exec time: 13.587599039078
Foreach exec time: 13.758492946625
4 испытание:
For exec time: 13.502116918564
Foreach exec time: 13.538818120956
5 испытание:
For exec time: 13.450010061264
Foreach exec time: 13.487359046936
6 испытание:
For exec time: 13.711478948593
Foreach exec time: 13.646157026291
Условия измерения:
Процессор: Intel(R) Core(TM) i7-3537U CPU @ 2.00GHz, cpu family : 6, model : 58, stepping : 9, cache size : 4096 KB
Оперативная память — 6 Гб, swap отсутствует.
Версия PHP:
Исходный код скрипта для измерения — см. в приложенном файле.
Еще в процессе измерения заметил периодические «всплески» времени выполнения до 15 секунд и даже более. Сначала я их списывал на то, что процессор нагревается и начинает пропускать такты. Но даже когда я принял меры (перед каждым измерением выдерживал компьютер в режиме ожидания и убеждался, что он охладился до 48 градусов — его нормальной рабочей температуры), эти всплески никуда не исчезали. Более-менее стабильные результаты стали появляться только после того, когда я отключил сеть.
Вот результаты, полученные на моем компьютере:
1 испытание:
For exec time: 13.21497797966
Foreach exec time: 13.658958911896
2 испытание:
For exec time: 13.949849128723
Foreach exec time: 13.773871898651
3 испытание:
For exec time: 13.587599039078
Foreach exec time: 13.758492946625
4 испытание:
For exec time: 13.502116918564
Foreach exec time: 13.538818120956
5 испытание:
For exec time: 13.450010061264
Foreach exec time: 13.487359046936
6 испытание:
For exec time: 13.711478948593
Foreach exec time: 13.646157026291
Условия измерения:
Процессор: Intel(R) Core(TM) i7-3537U CPU @ 2.00GHz, cpu family : 6, model : 58, stepping : 9, cache size : 4096 KB
Оперативная память — 6 Гб, swap отсутствует.
Версия PHP:
PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright © 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright © 1998-2017 Zend Technologies
with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright © 1999-2017, by Zend Technologies
Исходный код скрипта для измерения — см. в приложенном файле.
Еще в процессе измерения заметил периодические «всплески» времени выполнения до 15 секунд и даже более. Сначала я их списывал на то, что процессор нагревается и начинает пропускать такты. Но даже когда я принял меры (перед каждым измерением выдерживал компьютер в режиме ожидания и убеждался, что он охладился до 48 градусов — его нормальной рабочей температуры), эти всплески никуда не исчезали. Более-менее стабильные результаты стали появляться только после того, когда я отключил сеть.
Прикрепленные файлы:
- for.php (653 байта)
Ребята, давайте жить спокойно!
. Редактировалось 2 раза, последний — #3
Еще один вопрос, которым я часто задавался — что лучше: работать с массивами или объектами.
Сделал скрипт, который создает массив из 10 тысяч либо массивов-хешей, либо объектов, содержащих по 50 строковых полей в каждом, и измерил время создания всего перечисленного и объем пикового использования памяти. Результаты:
Массивы:
Memory used: 63955960 bytes, time: 0.32594585418701 seconds.
Memory used: 63955960 bytes, time: 0.3428430557251 seconds.
Memory used: 63955960 bytes, time: 0.28496503829956 seconds.
Memory used: 63955960 bytes, time: 0.33560585975647 seconds.
Memory used: 63955960 bytes, time: 0.33985209465027 seconds.
Объекты:
Memory used: 64478816 bytes, time: 0.3552839756012 seconds.
Memory used: 64478816 bytes, time: 0.35315895080566 seconds.
Memory used: 64478816 bytes, time: 0.36479520797729 seconds.
Memory used: 64478816 bytes, time: 0.34801006317139 seconds.
Memory used: 64478816 bytes, time: 0.34800601005554 seconds.
Таким образом, достаточно четко видно, что массивы и более экономны по памяти, и работа с ними, хоть и незначительно, всего на несколько процентов, но происходит быстрее. Поэтому для простого хранения данных (например, извлеченных из базы или предназначенных для шаблонизатора), когда возможности ООП не нужны, использование массивов более предпочтительно.
Условия измерения — те же самые, что и в предыдущем сообщении, скрипты прилагаются.
Сделал скрипт, который создает массив из 10 тысяч либо массивов-хешей, либо объектов, содержащих по 50 строковых полей в каждом, и измерил время создания всего перечисленного и объем пикового использования памяти. Результаты:
Массивы:
Memory used: 63955960 bytes, time: 0.32594585418701 seconds.
Memory used: 63955960 bytes, time: 0.3428430557251 seconds.
Memory used: 63955960 bytes, time: 0.28496503829956 seconds.
Memory used: 63955960 bytes, time: 0.33560585975647 seconds.
Memory used: 63955960 bytes, time: 0.33985209465027 seconds.
Объекты:
Memory used: 64478816 bytes, time: 0.3552839756012 seconds.
Memory used: 64478816 bytes, time: 0.35315895080566 seconds.
Memory used: 64478816 bytes, time: 0.36479520797729 seconds.
Memory used: 64478816 bytes, time: 0.34801006317139 seconds.
Memory used: 64478816 bytes, time: 0.34800601005554 seconds.
Таким образом, достаточно четко видно, что массивы и более экономны по памяти, и работа с ними, хоть и незначительно, всего на несколько процентов, но происходит быстрее. Поэтому для простого хранения данных (например, извлеченных из базы или предназначенных для шаблонизатора), когда возможности ООП не нужны, использование массивов более предпочтительно.
Условия измерения — те же самые, что и в предыдущем сообщении, скрипты прилагаются.
Прикрепленные файлы:
- object.php (543 байта)
- array.php (513 байтов)
Ребята, давайте жить спокойно!
Еще одно мое старое исследование: XML или JSON — скорость десерализации данных из JSON и XML. Из него видно, что JSON выгоднее по скорости, XML — по памяти. Возможно, со временем проведу измерение и для сериализации.
Ребята, давайте жить спокойно!
. Редактировалось 2 раза, последний — #5
Задался вопросом, что эффективнее: собирать длинную строку через множество операций конкатенации или же заполнять строками массив, а потом делать join. Оказалось, что первое — почти на порядок эффективнее по времени и в несколько раз — по памяти:
Использование массива с последующим объединением:
Время: 0.01195502281189 (11.9 мс)
Память: 2 203 672 байтов
Конкатенация строк:
Время: 0.0018341541290283 (1.8 мс)
Память: 663 552 байтов
Скрипт для тестирования прикладываю.
Использование массива с последующим объединением:
Время: 0.01195502281189 (11.9 мс)
Память: 2 203 672 байтов
Конкатенация строк:
Время: 0.0018341541290283 (1.8 мс)
Память: 663 552 байтов
Скрипт для тестирования прикладываю.
Прикрепленные файлы:
- concat.php (762 байта)
Ребята, давайте жить спокойно!
Одна страница
Распечатать У вас нет прав для отправки сообщений в эту тему.