Req #70363 [Opn]: improve performance of case-insensitive mb_*() operations
Edit report at https://bugs.php.net/bug.php?id=70363&edit=1
ID: 70363
Updated by: nikic@php.net
Reported by: jhdxr@php.net
Summary: improve performance of case-insensitive mb_*()
operations
Status: Open
Type: Feature/Change Request
Package: mbstring related
Operating System: irrelevent
PHP Version: 7.0.0RC1
Block user comment: N
Private report: N
New Comment:
The good news is that the first test case (using mb_stristr) is now more than 6 times faster on
master. The bad news is that this is still 3.5 times slower than the PCRE version.
Previous Comments:
------------------------------------------------------------------------
[2015-08-28 02:05:21] cmb@php.net
Apparently, this is not a general mb_*() issue, but rather related
to case-insensitive operations, as Yasuo has pointed out. It seems
that this is been caused due to the lack of native mbfl_*() case
insensitive operations, so PHP converts $needle and $haystack to
upper-case intermittently, what has some overhead.
Anyhow, this is not a bug, but rather a feature request to improve
the performance of case-insensitive mb_*() operations.
------------------------------------------------------------------------
[2015-08-27 11:57:31] yohgaki@php.net
Interesting result.
It seems https://3v4l.org/d8IAo is a worst case and
mbstring's case insensitive code has performance issue in general.
Tried case sensitive https://3v4l.org/ZF3TK version. The result
varies, but it seems mb_* functions have improvement margin. I get slower results consistently with
current master on my real PC. (I suppose 3v4l is VM or container)
If I use
$raw =
'0123456789abcdefghijklmnopqrstuvwxyzããããããããããããããããªã«ã¬ãã®ã¯ã²ãµã¸ã»ã¾ã¿ããããããããããã';
for https://3v4l.org/ZF3TK, case sensitive version mb_strstr()
is a little faster. BTW, pcre became a lot faster than 5.6. This is the reason why mb_strstr() is a
little faster than pcre version.
If anyone could make more generic benchmark script, i.e. benchmark mb_*() functions, it would be
helpful.
------------------------------------------------------------------------
[2015-08-26 16:07:52] jhdxr@php.net
Description:
------------
It seems mb_* is much slower than the original string related method, there are lots of data in the
user contribution section of the manual (<http://php.net/mb_strlen>, <http://php.net/manual/en/function.mb-strtolower.php>).
and today I read a post talk about this topic (<https://v2ex.com/t/216212>), and the author use an regular
expression instead of mb_*, which is, and to my surprise, much faster. Here is his code: <https://3v4l.org/d8IAo>. So i'm wondering why mb_* is so
slow. Are the users use them in a wrong manner, or our implements has some problem?
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=70363&edit=1
Thread (4 messages)