substr() 比 mb_substr() 更快,因其为字节级操作,无需编码解析;而 mb_substr() 需按字符语义处理多字节编码,开销大20%~50%,但可避免乱码;纯ASCII用 substr(),含中文/emoji等必须用 mb_substr() 并显式指定 'UTF-8'。

substr() 比 mb_substr() 更快。
原因很直接:substr() 是纯字节级操作,不解析字符编码,不做多字节边界判断;而 mb_substr() 必须识别 UTF-8 等编码的字符结构(比如一个中文占 3 字节、emoji 可能占 4 字节),每次调用都要做编码解析和字符计数,开销更大。
在 PHP 7.4 环境下实测(10 万次截取):
-
substr()执行耗时基准最低 -
mb_substr()平均慢 20%~50%,具体取决于字符串长度、中文/emoji 比例及是否显式传入编码
但要注意:
立即学习“PHP免费学习笔记(深入)”;
- 快 ≠ 正确。对含中文、日文、emoji 或其他非 ASCII 字符的字符串,用
substr()截取极易乱码或字符数错乱 -
mb_substr()虽慢一点,但按“字符”语义工作,结果可预测、可交付
所以实际选哪个,关键看场景:
- 纯英文、数字、ASCII 符号组成的字符串(如 token、UUID、日志 ID)→ 用
substr(),安全又快 - 用户昵称、评论、标题、多语言内容 → 必须用
mb_substr($str, $start, $length, 'UTF-8'),否则显示异常、逻辑出错
还有一点常被忽略:
-
mb_substr()性能损耗主要来自编码解析。若全程统一用 UTF-8,且每次都显式传'UTF-8'(不依赖mb_internal_encoding()),PHP 7.4+ 已有优化,差距比早期版本小很多
简单总结:
- 要速度且确定无多字节字符 →
substr() - 要正确性(绝大多数 Web 场景)→
mb_substr(),别省那点性能,乱码修复成本高得多



















