4 个提升脚本性能的 PHP 技巧
通常我会使用常规的、显而易见的 PHP 函数来编写代码来解决相应的问题。但对于其中一些问题,我找到了一些能够显著提高性能的替代解决方案。
在本文中,我想介绍一些替代方案。如果您正在寻找在生产环境中进一步缩短执行时间的方法,这将非常有用。让我们看看哪些 PHP 方法可以被更高性能的方法所取代,以及是否存在任何成本或权衡。
ℹ所有这些方法均在本地 Web 服务器上使用 PHP 7.4 进行了测试
1. 删除重复项
您有一个包含重复项的大数组,并且想要删除它们,只留下一个包含唯一值的数组。
🐌 常规
array_unique($array);
⚡ 替代方案
array_keys(array_flip($array));
⏲ 性能
我创建了一个包含超过 400 万个元素的数组,其中重复元素超过 300 万个。以下是结果:
方法 | 执行时间 |
---|---|
array_unique |
787.31 毫秒 |
array_keys array_flip |
434.03 毫秒 |
本次测试中,替代方法速度提升了1.8 倍(44.87%)。平均速度提升了约 1.5 倍(30%)。缺点:由于array_flip
用值替换了键,因此该方法仅适用于简单的一维数组。
2.获取随机数组元素
您有一个大数组并想从中选取一个随机值。
🐌 常规
array_rand($array);
⚡ 替代方案
$array[mt_rand(0, count($array) - 1)];
⏲ 性能
我创建了一个包含 500 万个元素的数组。以下是结果:
方法 | 执行时间 |
---|---|
array_rand |
25.99 微秒 |
mt_rand |
0.95 微秒 |
在本次测量中,替代方法的速度提高了27.3 倍(96.33%)。平均而言,速度提高了约 8 倍(87%)。这个结果尤其令人惊讶,因为mt_rand
梅森旋转随机数生成器的实现也令人惊讶,而且自 PHP 7.1 以来,内部随机化算法已更改为使用完全相同的算法。
3. 测试字母数字字符
您有一个字符串并想测试它是否仅包含字母数字字符。
🐌 常规
preg_match('/[a-zA-Z0-9]+/', $string);
⚡ 替代方案
ctype_alnum($string);
⏲ 性能
我创建了一个包含超过 10 万个字母数字和非字母数字字符串的数组。以下是结果:
方法 | 执行时间 |
---|---|
preg_match |
15.39 毫秒 |
ctype_alnum |
2.06 毫秒 |
在本次测量中,替代方法的速度提高了7.5 倍(86.59%)。平均而言,它的速度提高了约 4 倍(76%)。
这同样适用于ctype_alpha()
(检查字母字符)和ctype_digit()
(检查数字字符)。
4. 替换子字符串
您有一个字符串并想用另一个子字符串替换它的一部分。
🐌 常规
str_replace('a', 'b', $string);
⚡ 替代方案
strtr($string, 'a', 'b');
⏲ 性能
我创建了一个包含 500 万个随机字符串的数组。以下是结果:
方法 | 执行时间 |
---|---|
str_replace |
676.59 毫秒 |
strtr |
305.59 毫秒 |
在本次测量中,替代方法的速度提高了2.2 倍(54.83%)。平均而言,速度提高了约 2 倍(51%)。
其他性能改进
以下是我融入编码约定中的一些附加点,我发现它们可以稍微提高性能(如果适用):
- 优先使用 JSON 而非 XML
- 在循环之前声明变量,而不是在循环的每次迭代中声明变量
- 避免在循环头中调用函数(在每次迭代中调用
for ($i=0; $i<count($array); $i)
)count()
- 取消设置消耗内存的变量
- 优先使用 select 语句,而不是多个 if 语句
- 优先使用 require/include 而不是 require_once/include_once (确保正确的操作码缓存)
最后说几句:我知道关于过早优化的讨论。我也同意生产环境中的性能取决于数据库查询之类的瓶颈,在处理性能问题时应该重点关注这些瓶颈。但我认为,如果有更快、更易于处理和维护的替代方案,例如正则表达式,为什么不使用它们呢?
总结
我们已经看到,即使使用当前的 PHP 7.4(已经比以前的 PHP 版本快很多),仍然可以通过其他方法进一步提升脚本性能。如果您想亲自验证本文中提供的数据,我创建了一个包含所有测试的存储库:
devmount / fastest-php
测试不同的方法来提高 PHP 脚本性能
我使用了Bart van Hoekelen 的这个出色的工具来测量执行时间。
如果您知道其他提高某些 PHP 函数性能的方法,请随时在此处发表评论或在上述 repo 中创建问题/PR。
发布日期:2020年4月14日
文章来源:https://dev.to/devmount/4-php-tricks-to-boost-script-performance-ol1