类常量 字符串 对比 性能测试

写一个处理 url 的 PHP 工具类,需要用到很多字符串相关的函数,比如 preg_match、preg_replace、strpos 之类的。

正则表达式和查找的 needle 字符,都是用字符加引号直接作为参数传递给上述函数,比如:

preg_match(“#^http[s]?://#i”, $strUrl);

用以匹配是否是 http 开头的 url。

记得以前看过过类常量与普通常量的性能对比,类常量快得多,在这个例子上,把字符串传给函数,是不是每次调用都是先把字符串转换成内部变量呢?如果预先定义类常量,然后以常量为参数传给函数,是不是能快一点?像下面这样:

const PREG_HTTP_URL = ‘#^http[s]?://#i’;

preg_match(self::PREG_HTTP_URL, $strUrl);

两种方式,性能肯定不一样,那种更快呢?

揭晓结果:

运行外层方法 50 万次各 3 次,取平均值
字符串:[31284.85]q/s    [15.98]seconds
类常量:[29175.49]q/s    [17.14]seconds

可以看到,用类常量的方式,性能不升反降!!

现在还不太理解为什么会这样。

Tags:

1 comment

  1. 即使是用常量定义的,但传递给函数是,还要转为内部变量,
    反而增加了运算量?

    定义常量应该和预先定义个变量的速度差不多。

    以上纯属猜测,未经考证。

Leave a Reply

Your email address will not be published.

*