time() 底层调用一次 time(2),microtime() 默认触发两次系统调用并做浮点拼接,开销约3倍;microtime(true) 比字符串版快15%,但需注意精度与用途匹配。

time() 和 microtime() 的底层开销差异在哪
PHP 的 time() 本质是调用系统 time(2) 系统调用,只返回秒级整数;而 microtime()(默认不带参数)会触发两次系统调用:gettimeofday(2) 或 clock_gettime(CLOCK_MONOTONIC, ...),并做浮点拼接。这意味着后者天然多一次内核态切换和字符串/浮点运算。
实测在 Linux + PHP 8.2 下,100 万次调用平均耗时:time() 约 0.08s,microtime() 约 0.23s —— 差距接近 3 倍。
- 若只需判断“是否过了某分钟”,用
time()足够,别为“看起来更精确”换性能 -
microtime(true)比microtime()(返回字符串)快约 15%,因跳过字符串拼接 - Windows 下
microtime()开销更大,因依赖QueryPerformanceCounter+ 频繁校准
什么时候非用 microtime() 不可
不是“需要毫秒级时间”就要无脑上 microtime(),而是看场景是否真依赖微秒精度或高分辨率单调性。
- 写日志打点、APM 埋点、压测请求耗时统计:必须用
microtime(true),time()无法区分同一秒内的多次操作 - 实现防重放 token、分布式短时效 nonce:需微秒级熵值,
time()秒粒度太粗,容易碰撞 - 单元测试中 mock 时间:
microtime(true)更易模拟连续递增的高精度序列,time()在单秒内恒定,mock 成本反而更高
microtime() 返回字符串 vs true 参数的陷阱
microtime() 默认返回形如 "0.12345600 1712345678" 的字符串,空格分隔小数部分和整数部分;加 true 才返回 float 类型的秒数(如 1712345678.123456)。
立即学习“PHP免费学习笔记(深入)”;
- 字符串格式无法直接参与数值计算,强制转 float 会多一次类型转换开销,且可能因 locale 导致小数点解析失败
- float 返回值在 PHP 中是双精度,能精确表示微秒(1e-6),但超过约 2^53(≈9e15)秒后,毫秒及以下位将丢失精度 —— 不过这要到公元 285,429 年才出现,当前可忽略
- 注意:
microtime(true)返回值是相对系统启动的单调时间(通常),但不是绝对 UTC;如需严格 UTC 微秒时间戳,得组合DateTime::createFromFormat()+microtime(true),代价更高
高频调用下的替代方案:缓存 time() 或预生成
如果业务逻辑每秒调用几十次 time()(比如日志中间件、频率限制器),其实没必要每次都进内核——秒级时间在整秒内不变,完全可以缓存。
- 用静态变量缓存上一次
time()结果 + 当前$_SERVER['REQUEST_TIME_FLOAT'](PHP-FPM 自动注入)做兜底,避免重复调用 - CLI 脚本中可提前在启动时读一次
time(),后续用相对偏移计算“逻辑秒”,只要不跨秒就无需重读 - 极端场景(如游戏服务器帧时间)可用
hrtime()(PHP 7.3+),它基于 CPU cycle counter,比microtime()更快更稳,但不带时区信息,需自行对齐
真正卡性能的往往不是函数本身,而是没想清楚“到底要什么精度”——秒?毫秒?还是只是顺序先后?选错函数,优化再细也白搭。



















