php mb函数速度,php 7 mb_(多字节)函数比5.3(仅限windows)更慢约60%

我可以确认您的结果在Windows 7上是可重现的.

经过一些实验,我找到了一个快速的解决方案,即IMO甚至不应该产生影响.

从mb_strlen()功能签名可以看出,

如果省略encoding参数,它将使用内部编码.

这也适用于您使用的其他功能.

mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )

我发现奇怪的是,如果你通过调用mb_internal_encoding(“UTF-8”)将内部编码设置为UTF-8并省略编码参数,

功能变得更快.

PHP 5.5结果:

5.5.12

with encoding parameter:

- mb_strlen: 172 ms, result: 5

- mb_substr: 218 ms, result: う

- mb_strpos: 218 ms, result: 3

- mb_stripos: 1,669 ms, result: 3

- mb_strrpos: 234 ms, result: 3

- mb_strripos: 1,685 ms, result: 3

with internal encoding:

- mb_strlen: 47 ms, result: 5

- mb_substr: 78 ms, result: う

- mb_strpos: 62 ms, result: 3

- mb_stripos: 1,669 ms, result: 3

- mb_strrpos: 94 ms, result: 3

- mb_strripos: 1,669 ms, result: 3

PHP 7.0结果:

7.0.12

with encoding parameter:

- mb_strlen: 640 ms, result: 5

- mb_substr: 702 ms, result: う

- mb_strpos: 686 ms, result: 3

- mb_stripos: 7,067 ms, result: 3

- mb_strrpos: 749 ms, result: 3

- mb_strripos: 7,130 ms, result: 3

with internal encoding:

- mb_strlen: 31 ms, result: 5

- mb_substr: 31 ms, result: う

- mb_strpos: 47 ms, result: 3

- mb_stripos: 7,270 ms, result: 3

- mb_strrpos: 62 ms, result: 3

- mb_strripos: 7,116 ms, result: 3

不幸的是,这种快速解决方案并不完美,因为mb_stripos()和mb_strripos()似乎没有受到影响.

他们仍然很慢.

这是代码(缩写):

echo PHP_VERSION."\n";

echo "\nwith encoding parameter:\n";

$t = microtime(true)*1000;

for($i=0; $i<100000; $i++){

$n = mb_strlen("あえいおう","UTF-8");

}

$t = microtime(true)*1000-$t;

echo "- mb_strlen: ".number_format($t)." ms, result: {$n}\n";

$t = microtime(true)*1000;

for($i=0; $i<100000; $i++){

$n = mb_substr("あえいおう",-1,1,"UTF-8");

}

$t = microtime(true)*1000-$t;

echo "- mb_substr: ".number_format($t)." ms, result: {$n}\n";

//set internal encoding

//and omit encoding parameter

mb_internal_encoding("UTF-8");

echo "\nwith internal encoding:\n";

$t = microtime(true)*1000;

for($i=0; $i<100000; $i++){

$n = mb_strlen("あえいおう");

}

$t = microtime(true)*1000-$t;

echo "- mb_strlen: ".number_format($t)." ms, result: {$n}\n";

$t = microtime(true)*1000;

for($i=0; $i<100000; $i++){

$n = mb_substr("あえいおう",-1,1);

}

$t = microtime(true)*1000-$t;

echo "- mb_substr: ".number_format($t)." ms, result: {$n}\n";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值