Skip to content

Очень простой скрипт тестирования быстродействия PHP | Very simple script for testing of PHP operations speed (rusoft repo mirror)

License

rusoft/php-simple-benchmark-script

Repository files navigation

Простой скрипт проверки быстродействия PHP

Работает со всеми версиями ПХП: от 4.3 до 8.2

Зависимости

Необходимые модули для полного тестирования php:

  • pcre
  • mbstring
  • json
  • dom
  • simplexml
  • intl
  • optional:
    • gd
    • imagick
    • brotli
    • zlib
    • bz2
    • zstd
    • igbinary
    • msgpack

Обычно они уже установлены или "вкомпилированны" в php.

Проверить наличие:

  • в консоли php -m
  • или через вывод функции phpinfo()

Модули, влияющие на результаты тестов

  • xdebug - может замедлить работу большей части тестов в два раза, а некоторых, связанных с обработкой ошибок - в 10!
  • opcache - может закешировать выполнение функций, или выкинуть "не влияющие на выполнение" куски кода
  • другие ускорители оп-кода: xcache, apc, eaccelerator и т.п.

Запуск

0. Файлы

Нужно положить в один каталог файлы: bench.php, common.inc, php5.inc, php7.inc, igbinary.inc, msgpack.inc, compression.inc, php-gd-imagick-common.inc, php-gd.inc, php-imagick.inc, test.xml.

1. Через консоль

Команда:

Usage: bench.php [-h|--help] [-x|--debug] [-C|--dont-use-colors] [-J|--print-json] [-M|--print-machine] [-d|--dont-recalc] [-D|--dumb-test-print] [-L|--list-tests] [-I|--system-info] [-S|--do-not-task-set] [-m|--memory-limit=130] [-t|--time-limit=600] [-T|--run-test=name1 ...]

	-h|--help		- print this help and exit
	-x|--debug		- enable debug mode, raise output level
	-C|--dont-use-colors	- disable printing html-span or color sequences for capable terminal: xterm, *-color, *-256color. And not in JSON/machine mode.
	-J|--print-json	- enable printing only in JSON format, useful for automated tests. disables print-machine.
	-M|--print-machine	- enable printing only in machine parsable format, useful for automated tests. disables print-json.
	-d|--dont-recalc	- do not recalculate test times / operations count even if memory of execution time limits are low
	-D|--dumb-test-print	- print dumb test time, for debug purpose
	-L|--list-tests		- output list of available tests and exit
	-I|--system-info	- output system info but do not run tests and exit
	-m|--memory-limit <Mb>	- set memory_limit value in Mb, defaults to 130 (Mb)
	-t|--time-limit <sec>	- set max_execution_time value in seconds, defaults to 600 (sec)
	-T|--run-test <name>	- run selected test, test names from --list-tests output, can be defined multiple times

Например: php bench.php -m=64 -t=30

Второй вариант передачи значений для параметров - переменные окружения:

env PHP_MEMORY_LIMIT=64 PHP_TIME_LIMIT=30 php bench.php

Доступные переменные:

  • PHP_TIME_LIMIT=<Секунды>
  • PHP_DEBUG_MODE=0/1
  • DONT_USE_COLORS=0/1
  • PRINT_JSON=0/1
  • PRINT_MACHINE=0/1
  • PHP_MEMORY_LIMIT=<Мб>
  • DONT_RECALCULATE_LIMITS=0/1
  • LIST_TESTS=0/1
  • SYSTEM_INFO=0/1
  • RUN_TESTS=test1,test2,...

Дополнительно (утилиты в Linux)

  • Вы можете установить приоритет процесса с помощью команды nice - от -20 (высокий) до 19 (низкий). Пример, приоритет 5: nice -5 php bench.php. Смотрите man nice.
  • Вы можете установить приоритет ввода-вывода с помощью команды ionice. Пример: ionice -c3 php bench.php. Смотрите man ionice.
  • Вы можете привязать выполнение скрипта к ядру процессора с помощью команды taskset. Пример: taskset -c -p 0 php bench.php. Смотрите man taskset.
  • Вы можете комбинировать команды: taskset -c -p 0 nice -10 ionice -c3 php bench.php.

2. Через веб-сервера (apache + php)

Просто положите в любую доступную для выполнения php директорию сайта, например в корень.

Потом скрипт можно будет вызывать с параметрами, как из консоли: curl http://www.example.com/bench.php?memory_limit=64&time_limit=30 или через браузер.

Доступные параметры:

  • time_limit=Секунды
  • debug_mode=0/1
  • dont_use_colors=0/1
  • print_json=0/1
  • print_machine=0/1
  • memory_limit=Мб
  • dont_recalculate_limits=0/1
  • list_tests=0/1
  • system_info=0/1
  • run_tests=test1,test2,...

Учет параметров хостинга

На многих хостингах параметры memory_limit и max_execution_time могут быть жестко зафиксированы.

В этом случае скрипт не сможет установить переданные в него значения параметров, по крайней мере не выше лимитов.

Пересчет времени выполнения скрипта будет произведен по наименьшим результирующим значениям.

Другие платформы

Например, на Raspberry Pi 2B, 3B и других подобных платах скорость выполнения настолько медленная, что приходится указвать параметры -d -t 3600, чтобы прошли все тесты.

Это касается всех ARM, MIPS и т.п. А так же старых процессоров AMD и Intel, как Celeron, Atom, Duron и т.п.

Пример вывода скрипта

Обычный режим

<<< WARNING >>> You need to disable Xdebug extension! It greatly slow things down! And mess with PHP internals.
<<< WARNING >>> Execution time limit not droppped to '600' seconds!
Script will have only '0' seconds to run.
<<< WARNING >>> Extension 'xdebug' loaded! It will affect results and slow things greatly! Even if not enabled!
<<< WARNING >>> Set xdebug.mode in php.ini / VHost or FPM config / php_admin_value or via cmd '-dxdebug.mode=off' option of PHP executable.

-------------------------------------------------------------------------------------------
|                                  PHP BENCHMARK SCRIPT                                   |
-------------------------------------------------------------------------------------------
Start               : 2022-05-03 18:22:49
Server              : Linux/5.4.0-104-lowlatency x86_64
Platform            : Linux
System              : Ubuntu 18.04.6 LTS
CPU                 :
              model : Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz
              cores : 4
          available : 4
                MHz : 3600 MHz
Benchmark version   : 1.0.57
PHP version         : 7.4.29-SergeyD/6.1
PHP time limit      : 0 sec
Setup time limit    : 600 sec
PHP memory limit    : 128M
Setup memory limit  : 130 Mb
Crypt hash algo     : MD5
     Loaded modules
          -useful->
               json : yes
           mbstring : yes;
               pcre : yes; version: 10.39 2021-10-29
          simplexml : yes; libxml version: 2.9.4
                dom : yes
               intl : yes; icu version: 66.1
        -optional->
                 gd : yes: version: 2.2.5
            imagick : yes: version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org
     -alternative->
           igbinary : yes
            msgpack : yes
              jsond : no
   jsond as json >> : no
     -compression->
               zlib : yes
                bz2 : yes
                lz4 : yes
               zstd : yes
             brotli : yes
       -affecting->
            opcache : yes; enabled: 0
             xcache : no; enabled: 0
                apc : no; enabled: 0
       eaccelerator : no; enabled: 0
             xdebug : yes, enabled: 1, mode: 'develop'
     PHP parameters
       open_basedir : is empty? yes
   mb.func_overload : 0
-------------------------------------------------------------------------------------------
TEST NAME                      :      SECONDS |       OP/SEC |      OP/SEC/MHz |    MEMORY
-------------------------------------------------------------------------------------------
01_math                        :    2.958 sec | 676.22 kOp/s | 178.48  Ops/MHz |      4 Mb
02_string_concat               :    1.683 sec |  14.86 MOp/s |   3.92 kOps/MHz |  89.83 Mb
03_1_string_number_concat      :    1.544 sec |   3.24 MOp/s | 854.83  Ops/MHz |      4 Mb
03_2_string_number_format      :    1.348 sec |   3.71 MOp/s | 979.33  Ops/MHz |      4 Mb
04_string_simple_functions     :    1.320 sec | 984.64 kOp/s | 259.88  Ops/MHz |      4 Mb
05_string_multibyte            :    1.061 sec | 122.47 kOp/s |  32.32  Ops/MHz |      4 Mb
06_string_manipulation         :    2.397 sec | 542.37 kOp/s | 143.15  Ops/MHz |      4 Mb
07_regex                       :    2.035 sec | 638.84 kOp/s | 168.61  Ops/MHz |      4 Mb
08_1_hashing                   :    2.030 sec | 640.31 kOp/s | 169.00  Ops/MHz |      4 Mb
08_2_crypt                     :    8.698 sec |   1.15 kOp/s |   0.30  Ops/MHz |      4 Mb
09_json_encode                 :    2.322 sec | 559.91 kOp/s | 147.78  Ops/MHz |      4 Mb
10_json_decode                 :    3.556 sec | 365.54 kOp/s |  96.48  Ops/MHz |      4 Mb
11_igb_serialize               :    2.894 sec | 449.19 kOp/s | 124.78  Ops/MHz |      3 Mb
11_msgpack_pack                :    2.054 sec | 633.01 kOp/s | 175.84  Ops/MHz |      3 Mb
11_serialize                   :    3.727 sec | 348.79 kOp/s |  96.89  Ops/MHz |      3 Mb
12_igb_unserialize             :    2.123 sec | 612.31 kOp/s | 170.09  Ops/MHz |      3 Mb
12_msgpack_unpack              :    2.657 sec | 489.30 kOp/s | 135.92  Ops/MHz |      3 Mb
12_unserialize                 :    3.226 sec | 402.91 kOp/s | 111.92  Ops/MHz |      3 Mb
11_serialize                   :    1.551 sec | 838.30 kOp/s | 221.25  Ops/MHz |      4 Mb
12_unserialize                 :    1.677 sec | 774.97 kOp/s | 204.54  Ops/MHz |      4 Mb
13_array_fill                  :    3.740 sec |  24.07 MOp/s |   6.35 kOps/MHz |     24 Mb
14_array_range                 :    2.007 sec |  74.74 kOp/s |  19.73  Ops/MHz |     24 Mb
14_array_unset                 :    2.833 sec |  31.77 MOp/s |   8.38 kOps/MHz |     24 Mb
15_clean_loops                 :    1.342 sec | 298.14 MOp/s |  78.69 kOps/MHz |      4 Mb
16_loop_ifelse                 :    1.992 sec |  50.20 MOp/s |  13.25 kOps/MHz |      4 Mb
17_loop_ternary                :    3.057 sec |  32.71 MOp/s |   8.63 kOps/MHz |      4 Mb
18_1_loop_defined_access       :    1.017 sec |  49.15 MOp/s |  12.97 kOps/MHz |      4 Mb
18_2_loop_undefined_access     :    4.729 sec |  10.57 MOp/s |   2.79 kOps/MHz |      4 Mb
19_type_functions              :    1.152 sec |   3.47 MOp/s | 916.65  Ops/MHz |      4 Mb
20_type_casting                :    1.178 sec |   3.39 MOp/s | 895.86  Ops/MHz |      4 Mb
21_0_loop_exception_none       :    0.204 sec |  48.94 MOp/s |  12.92 kOps/MHz |      4 Mb
21_1_loop_exception_try        :    0.212 sec |  47.21 MOp/s |  12.46 kOps/MHz |      4 Mb
21_2_loop_exception_catch      :    3.214 sec |   3.11 MOp/s | 821.23  Ops/MHz |      4 Mb
22_loop_null_op                :    1.266 sec |  47.41 MOp/s |  12.51 kOps/MHz |      4 Mb
23_loop_spaceship_op           :    1.202 sec |  49.93 MOp/s |  13.18 kOps/MHz |      4 Mb
26_1_class_public_properties   :    0.133 sec |  75.10 MOp/s |  19.82 kOps/MHz |      4 Mb
26_2_class_getter_setter       :    0.425 sec |  23.54 MOp/s |   6.21 kOps/MHz |      4 Mb
26_3_class_magic_methods       :    1.189 sec |   8.41 MOp/s |   2.22 kOps/MHz |      4 Mb
27_simplexml                   :    4.121 sec |  12.13 kOp/s |   3.20  Ops/MHz |      4 Mb
28_domxml                      :    4.228 sec |  11.83 kOp/s |   3.12  Ops/MHz |      4 Mb
29_datetime                    :    0.571 sec | 875.87 kOp/s | 231.17  Ops/MHz |      4 Mb
30_intl_number_format          :    0.826 sec |  24.22 kOp/s |   6.39  Ops/MHz |      4 Mb
31_intl_message_format         :    4.236 sec |  47.22 kOp/s |  12.46  Ops/MHz |      4 Mb
32_intl_calendar               :    0.844 sec | 355.34 kOp/s |  93.79  Ops/MHz |      4 Mb
33_phpinfo_generate            :    1.440 sec |   6.95 kOp/s |   1.83  Ops/MHz |      4 Mb
34_gd_qrcode                   :    0.923 sec |   1.08 kOp/s |   0.30  Ops/MHz |      4 Mb
35_imagick_qrcode              :    2.839 sec | 352.18  Op/s |   0.10  Ops/MHz |      4 Mb
36_brotli_compress             :    5.012 sec | 199.50 kOp/s |  51.47  Ops/MHz |      3 Mb
36_bzip2_compress              :   22.065 sec |  22.66 kOp/s |   5.85  Ops/MHz |      3 Mb
36_gzip_compress               :   52.977 sec |  94.38 kOp/s |  24.35  Ops/MHz |      3 Mb
36_lz4_compress                :    0.378 sec |   1.32 MOp/s | 341.52  Ops/MHz |      3 Mb
36_zlib_compress               :   51.905 sec |  96.33 kOp/s |  24.85  Ops/MHz |      3 Mb
36_zstd_compress               :   27.937 sec | 178.98 kOp/s |  46.17  Ops/MHz |      3 Mb
-------------------------------------------------------------------------------------------
Total time:                    :   81.337 sec |  13.73 MOp/s |   3.62 kOps/MHz |
Current PHP memory usage:      :        4 Mb
Peak PHP memory usage:         :    86.58 Mb

JSON-формат

Команда: php74 -derror_log= -dxdebug.mode=off bench.php -T 01_math -T 33_phpinfo_generate -J

{ 
"php_benchmark_script": "1.0.48-dev",
"start": "2022-05-03 22:11:19",
"server": "Linux/5.4.0-104-lowlatency x86_64",
"system": "Ubuntu 18.04.6 LTS",
"php_version": "7.4.29-SergeyD/6.1",
"results": {
  "columns": [ "test_name", "seconds", "op\/sec", "op\/sec\/MHz", "memory" ],
  "rows": [
    [ "01_math", 3.4119508266449, 586174.91916397, 162.82636643444, 4194304 ],
    [ "33_phpinfo_generate", 3.6402199268341, 2747.0867697538, 0.76307965826494, 4194304 ],
    null
  ]
},
"total": { "seconds": 7.052170753479, "op\/sec":285018.62338039, "op\/sec\/MHz":79.171839827885 },
"messages_count": 0,
"end":true
}

Машино-читаемый формат

Команда: php74 -derror_log= -dxdebug.mode=off bench.php -T 01_math -T 33_phpinfo_generate -M

PHP_BENCHMARK_SCRIPT: 1.0.48-dev
START: 2022-05-03 22:11:52
SERVER: Linux/5.4.0-104-lowlatency x86_64
SYSTEM: Ubuntu 18.04.6 LTS
PHP_VERSION: 7.4.29-SergeyD/6.1
TEST_NAME: SECONDS, OP/SEC, OP/SEC/MHz, MEMORY
01_math: 3.3808300495148, 591570.70030392, 164.32519452887, 4194304
33_phpinfo_generate: 3.6759581565857, 2720.3791702809, 0.75566088063359, 4194304
TOTAL: 7.0567882061005, 284832.12777484, 79.120035493011

В браузере

Ссылка вида: http://sergey.home.lan/bench/bench.php?system_info=1 Информация о системе

About

Очень простой скрипт тестирования быстродействия PHP | Very simple script for testing of PHP operations speed (rusoft repo mirror)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages