microtime(bool $asFloat = false): string|float
| 參數 | 回傳 | 範例 |
|---|---|---|
| false (預設) | 字串 "msec sec" | "0.123456 1700000000" |
| true | 浮點數 (秒.微秒) | 1700000000.123456 |
sec:Unix 時間戳 (秒);msec:微秒部分 (0~0.999999)
<?php
$ts = microtime(true); // 直接取得 float
echo $ts; // 1700000000.123456
?>
<?php
$start = microtime(true);
// 待測程式碼
for ($i = 0; $i < 100000; $i++) {
md5($i);
}
$end = microtime(true);
printf("執行時間: %.4f 秒\n", $end - $start);
// 輸出: 執行時間: 0.0234 秒
?>
<?php
$parts = explode(' ', microtime());
$start = (float)$parts[0] + (float)$parts[1];
// 等同 microtime(true)
?>
<?php
class Timer {
private $start;
private $laps = [];
private $labels = [];
public function __construct() {
$this->start = microtime(true);
}
public function lap(string $label = ''): float {
$now = microtime(true);
$elapsed = $now - $this->start;
$this->laps[] = $elapsed;
$this->labels[] = $label ?: 'lap ' . count($this->laps);
return $elapsed;
}
public function stop(): float {
return microtime(true) - $this->start;
}
public function report(): void {
$total = $this->stop();
echo "總耗時: " . number_format($total, 6) . " 秒\n";
$prev = 0;
foreach ($this->laps as $i => $lap) {
$diff = $lap - $prev;
echo sprintf(" %s: %.6f 秒 (間隔: %.6f)\n", $this->labels[$i], $lap, $diff);
$prev = $lap;
}
}
}
// 使用
$t = new Timer();
sleep(1);
$t->lap('sleep 1');
usleep(500000);
$t->lap('usleep 0.5');
$t->report();
/*
總耗時: 1.500123 秒
sleep 1: 1.000045 秒 (間隔: 1.000045)
usleep 0.5: 1.500123 秒 (間隔: 0.500078)
*/
?>
| 項目 | 說明 |
|---|---|
| 精度 | 依賴系統 gettimeofday(),通常微秒級;Windows 早期版本精度較低 (~1ms) |
| 浮點數精度 | PHP float 為 IEEE 754 雙精度,約 15-17 位有效數字,足夠表示秒.微秒 |
| 單調性 | 非單調:系統時間調整 (NTP、手動改時間) 會導致時間倒退 |
| 單調計時替代 | PHP 7.3+ hrtime(true) 回傳奈秒整數,單調不受系統時間影響 |
| 效能影響 | 極低,可放心大量呼叫 |
<?php
// 回傳奈秒整數 (單調時鐘)
$start = hrtime(true);
// 程式碼
$end = hrtime(true);
echo "耗時: " . ($end - $start) / 1e9 . " 秒\n";
// 陣列格式 [秒, 奈秒]
list($sec, $ns) = hrtime(false);
?>
建議: 精度測量、基準測試、單調計時請用 hrtime();一般時間戳、日誌、快取過期用 microtime(true)。
<?php
function queryWithTiming(PDO $pdo, string $sql, array $params = [], float $slowThreshold = 0.1): array {
$start = microtime(true);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$elapsed = microtime(true) - $start;
if ($elapsed > $slowThreshold) {
error_log(sprintf(
"[SLOW QUERY %.4fs] %s -- %s",
$elapsed, $sql, json_encode($params)
));
}
return $result;
}
?>
microtime(true) 是最常用的高精度計時方式$end - $starthrtime() (PHP 7.3+)