写一个处理 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
可以看到,用类常量的方式,性能不升反降!!
现在还不太理解为什么会这样。
即使是用常量定义的,但传递给函数是,还要转为内部变量,
反而增加了运算量?
定义常量应该和预先定义个变量的速度差不多。
以上纯属猜测,未经考证。