Skip to content

Instantly share code, notes, and snippets.

@KEINOS
Last active May 19, 2020 04:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KEINOS/61b4d1bec18696713a726079592dc919 to your computer and use it in GitHub Desktop.
Save KEINOS/61b4d1bec18696713a726079592dc919 to your computer and use it in GitHub Desktop.
[Bench] Which is faster, preg_match() or ctype_alnum() ?
<?php
/**
* Benchmark between preg_match() and ctype_alnum()
*
* $ phpbench run --retry-threshold=1 --revs=1000000 \
* --iterations=10 --report=compare --report=aggregate \
* ./PregMatchVsCtypeAlnumBench.php
*
* Requirement
* $ composer require phpbench/phpbench @dev --dev
*
* @BeforeMethods({"setUp"})
*/
class PregMatchVsCtypeAlnumBench
{
public function setUp()
{
// List of characters available
$this->list_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$this->pattern = '/[^A-Za-z0-9]/';
// Generate string to test
$len_str = 64;
$len_list_chars = strlen($this->list_chars);
$str_random = '';
for ($i = 0; $i < $len_str; $i++) {
$pos = \mt_rand() % $len_list_chars;
$str_random .= $this->list_chars[$pos];
}
// Set test string
$this->str_random = $str_random;
}
public function benchCtypeAlnum()
{
$pattern = $this->pattern;
$subject = $this->str_random;
if (ctype_alnum($subject)) {
return true;
}
return false;
}
public function benchPregMatch()
{
$pattern = $this->pattern;
$subject = $this->str_random;
if (preg_match($pattern, $subject) === 0) {
return true;
}
return false;
}
}
{
"require-dev": {
"phpbench/phpbench": "@dev"
}
}
$ # -------------------------------------------------------------------------------
$ # Bench result (Local run, macOS Mojave, PHP 7.1.33)
$ # -------------------------------------------------------------------------------
$ #
$ ./vendor/bin/phpbench run --retry-threshold=1 --revs=1000000 --iterations=10 --report=compare --report=aggregate ./PregMatchVsCtypeAlnumBench.php
PhpBench @git_tag@. Running benchmarks.
\PregMatchVsCtypeAlnumBench
benchCtypeAlnum.........................R1 I9 [μ Mo]/r: 0.179 0.178 (μs) [μSD μRSD]/r: 0.001μs 0.38%
benchPregMatch..........................R1 I0 [μ Mo]/r: 1.693 1.693 (μs) [μSD μRSD]/r: 0.008μs 0.45%
2 subjects, 20 iterations, 2,000,000 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 0.178 [0.936 0.936] 0.179 (μs)
⅀T: 18.715μs μSD/r 0.004μs μRSD/r: 0.420%
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| benchmark | subject | set | revs | suite:1343c471444b2eadced4437583d78a4640912081:mean |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 0.179μs |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 1.693μs |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
suite: 1343c471444b2eadced4437583d78a4640912081, date: 2020-05-19, stime: 03:52:51
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | set | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 10 | 422,816b | 0.178μs | 0.179μs | 0.178μs | 0.179μs | 0.001μs | 0.38% | 1.00x |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 10 | 422,816b | 1.681μs | 1.693μs | 1.693μs | 1.709μs | 0.008μs | 0.45% | 9.48x |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
$ php -v | head -1
PHP 7.1.33 (cli) (built: Jan 26 2020 22:52:32) ( NTS )
$ composer --version
Composer version 1.9.3 2020-02-04 12:58:49
$ composer show 2>&1 | grep phpbench
phpbench/container 1.2 Simple, configurable, service container.
phpbench/dom 0.2.0 DOM wrapper to simplify working with the PHP DOM implementation
phpbench/phpbench 0.16.10 PHP Benchmarking Framework
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G4032
$ # Version of compiled modules installed
$ php -r 'foreach (get_loaded_extensions() as $extension) echo "$extension: " . phpversion($extension) . PHP_EOL;'
Core: 7.1.33
date: 7.1.33
libxml: 7.1.33
openssl: 7.1.33
pcre: 7.1.33
sqlite3: 7.1.33
zlib: 7.1.33
bcmath: 7.1.33
bz2: 7.1.33
calendar: 7.1.33
ctype: 7.1.33
curl: 7.1.33
dba: 7.1.33
dom: 20031129
hash: 1.0
fileinfo: 1.0.5
filter: 7.1.33
ftp: 7.1.33
gd: 7.1.33
SPL: 7.1.33
iconv: 7.1.33
json: 1.5.0
ldap: 7.1.33
mbstring: 7.1.33
session: 7.1.33
standard: 7.1.33
mysqlnd: mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $
PDO: 7.1.33
pdo_mysql: 7.1.33
pdo_pgsql: 7.1.33
pdo_sqlite: 7.1.33
pgsql: 7.1.33
Phar: 2.0.2
posix: 7.1.33
readline: 7.1.33
Reflection: 7.1.33
mysqli: 7.1.33
shmop: 7.1.33
SimpleXML: 7.1.33
snmp: 0.1
soap: 7.1.33
sockets: 7.1.33
exif: 7.1.33
sysvmsg: 7.1.33
sysvsem: 7.1.33
sysvshm: 7.1.33
tidy: 7.1.33
tokenizer: 7.1.33
wddx: 7.1.33
xml: 7.1.33
xmlreader: 7.1.33
xmlrpc: 7.1.33
xmlwriter: 7.1.33
xsl: 7.1.33
zip: 1.13.5
/app # # -------------------------------------------------------------------------------
/app # # Bench result (Docker, php:7.1.33-cli-alpine)
/app # # -------------------------------------------------------------------------------
/app #
/app # ./vendor/bin/phpbench run --retry-threshold=1 --revs=1000000 --iterations=10 --report=compare --report=aggregate ./PregMatchVsCtypeAlnumBench.php
PhpBench @git_tag@. Running benchmarks.
\PregMatchVsCtypeAlnumBench
benchCtypeAlnum.........................R1 I8 [μ Mo]/r: 0.796 0.796 (μs) [μSD μRSD]/r: 0.004μs 0.51%
benchPregMatch..........................R1 I7 [μ Mo]/r: 0.425 0.426 (μs) [μSD μRSD]/r: 0.002μs 0.56%
2 subjects, 20 iterations, 2,000,000 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 0.421 [0.611 0.611] 0.429 (μs)
⅀T: 12.211μs μSD/r 0.003μs μRSD/r: 0.538%
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| benchmark | subject | set | revs | suite:1343c47122614c102116bf78b2ecc38234e3b0f3:mean |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 0.796μs |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 0.425μs |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
suite: 1343c47122614c102116bf78b2ecc38234e3b0f3, date: 2020-05-19, stime: 03:35:16
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | set | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 10 | 414,896b | 0.790μs | 0.796μs | 0.796μs | 0.803μs | 0.004μs | 0.51% | 1.87x |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 10 | 414,896b | 0.421μs | 0.425μs | 0.426μs | 0.429μs | 0.002μs | 0.56% | 1.00x |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
/app # php -v | head -1
PHP 7.1.33 (cli) (built: Oct 25 2019 07:17:47) ( NTS )
/app # composer --version
Composer version 1.10.6 2020-05-06 10:28:10
/app # composer show 2>&1 | grep phpbench
phpbench/container 1.2 Simple, configurable, service container.
phpbench/dom 0.2.0 DOM wrapper to simplify working with the PHP DOM implementation
phpbench/phpbench 0.16.10 PHP Benchmarking Framework
/app # cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Alpine Linux v3.10"
/app # # -------------------------------------------------------------------------------
/app # # Bench result (Docker, php:7.4.5-cli-alpine)
/app # # -------------------------------------------------------------------------------
/app #
/app # ./vendor/bin/phpbench run --retry-threshold=1 --revs=1000000 --iterations=10 --report=compare --report=aggregate ./PregMatchVsCtypeAlnumBench.php
PhpBench @git_tag@. Running benchmarks.
\PregMatchVsCtypeAlnumBench
benchCtypeAlnum.........................R1 I7 [μ Mo]/r: 0.662 0.660 (μs) [μSD μRSD]/r: 0.003μs 0.50%
benchPregMatch..........................R2 I7 [μ Mo]/r: 0.215 0.216 (μs) [μSD μRSD]/r: 0.001μs 0.50%
2 subjects, 20 iterations, 2,000,000 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 0.214 [0.438 0.438] 0.217 (μs)
⅀T: 8.770μs μSD/r 0.002μs μRSD/r: 0.499%
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| benchmark | subject | set | revs | suite:1343c47e20292d83fe245094977e91decfee3831:mean |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 0.662μs |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 0.215μs |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
suite: 1343c47e20292d83fe245094977e91decfee3831, date: 2020-05-19, stime: 03:21:39
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | set | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 10 | 455,968b | 0.657μs | 0.662μs | 0.660μs | 0.666μs | 0.003μs | 0.50% | 3.07x |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 10 | 455,968b | 0.214μs | 0.215μs | 0.216μs | 0.217μs | 0.001μs | 0.50% | 1.00x |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
/app # php -v | head -1
PHP 7.4.5 (cli) (built: Apr 17 2020 11:56:45) ( NTS )
/app # composer show 2>&1 | grep phpbench
phpbench/container 1.2 Simple, configurable, service container.
phpbench/dom 0.2.0 DOM wrapper to simplify working with the PHP DOM implementation
phpbench/phpbench dev-master 7c3e155 PHP Benchmarking Framework
/app # cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Alpine Linux v3.11"
/app # # -------------------------------------------------------------------------------
/app # # Bench result (Docker, keinos/php8-jit:latest)
/app # # -------------------------------------------------------------------------------
/app #
/app # ./vendor/bin/phpbench run --retry-threshold=1 --revs=1000000 --iterations=10 --report=compare --report=aggregate ./PregMatchVsCtypeAlnumBench.php
PhpBench @git_tag@. Running benchmarks.
\PregMatchVsCtypeAlnumBench
benchCtypeAlnum.........................R1 I2 [μ Mo]/r: 0.670 0.670 (μs) [μSD μRSD]/r: 0.002μs 0.35%
benchPregMatch..........................R3 I7 [μ Mo]/r: 0.229 0.230 (μs) [μSD μRSD]/r: 0.001μs 0.56%
2 subjects, 20 iterations, 2,000,000 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 0.227 [0.450 0.450] 0.231 (μs)
⅀T: 8.991μs μSD/r 0.002μs μRSD/r: 0.456%
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| benchmark | subject | set | revs | suite:1343c47e481511132c08cfb70f13e90c9db7ea22:mean |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 0.670μs |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 0.229μs |
+----------------------------+-----------------+-----+---------+-----------------------------------------------------+
suite: 1343c47e481511132c08cfb70f13e90c9db7ea22, date: 2020-05-19, stime: 03:41:46
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | set | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| PregMatchVsCtypeAlnumBench | benchCtypeAlnum | 0 | 1000000 | 10 | 444,728b | 0.666μs | 0.670μs | 0.670μs | 0.674μs | 0.002μs | 0.35% | 2.92x |
| PregMatchVsCtypeAlnumBench | benchPregMatch | 0 | 1000000 | 10 | 444,728b | 0.227μs | 0.229μs | 0.230μs | 0.231μs | 0.001μs | 0.56% | 1.00x |
+----------------------------+-----------------+-----+---------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
/app # php -v | head -1
PHP 8.0.0-dev (cli) (built: Oct 2 2019 10:21:08) ( NTS )
/app # composer --version
Composer version 1.10.6 2020-05-06 10:28:10
/app # composer show 2>&1 | grep phpbench
phpbench/container 1.2 Simple, configurable, service container.
phpbench/dom 0.2.0 DOM wrapper to simplify working with the PHP DOM implementation
phpbench/phpbench 0.16.10 PHP Benchmarking Framework
/app # cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Alpine Linux v3.10"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment