首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP microtime() 函數詳解:高精度計時、效能分析與浮點數用法

     編輯:PHP 相關知識

函數原型

microtime(bool $asFloat = false): string|float

回傳格式

參數回傳範例
false (預設)字串 "msec sec""0.123456 1700000000"
true浮點數 (秒.微秒)1700000000.123456

sec:Unix 時間戳 (秒);msec:微秒部分 (0~0.999999)

常見用法

1. 取得高精度時間戳 (PHP 5.0+)

<?php
$ts = microtime(true); // 直接取得 float
echo $ts; // 1700000000.123456
?>

2. 程式執行時間測量 (標準模式)

<?php
$start = microtime(true);

// 待測程式碼
for ($i = 0; $i < 100000; $i++) {
    md5($i);
}

$end = microtime(true);
printf("執行時間: %.4f 秒\n", $end - $start);
// 輸出: 執行時間: 0.0234 秒
?>

3. 手動解析字串格式 (舊版相容)

<?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) 回傳奈秒整數,單調不受系統時間影響
效能影響極低,可放心大量呼叫

hrtime() 現代替代 (PHP 7.3+)

<?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 - $start
  • 需單調計時(防 NTP 跳變)請用 hrtime() (PHP 7.3+)
  • 封裝 Timer 類別方便多點式分析
  • 微秒級精度足夠大多數 Web 效能分析場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved