在相同硬體、相同 Memcached 實例、相同數據量 (51.2 萬條、每條 1KB、總計 500MB) 下,對比 PHP (PECL memcache) 與 Perl (Cache::Memcached) 的寫入性能。
test1k.php<?php
ini_set('memcache.hash_function', 'crc32');
$mem = new Memcache;
$mem->addServer('localhost', 30001);
$mem->flush();
$data = str_repeat('x', 1024); // 1KB
for ($i = 0; $i < 512000; $i++) {
$mem->set($i, $data, 0, 1000);
}
?>
test1k.pl#!/usr/bin/perl
use Cache::Memcached;
$mem = Cache::Memcached->new({ servers => ['localhost:30001'] });
$mem->flush_all();
my $data = 'x' x 1024; # 1KB
for (my $i = 0; $i < 512000; $i++) {
$mem->set($i, $data);
}
$mem->disconnect_all();
| 語言 | Real Time | User CPU | Sys CPU |
|---|---|---|---|
| Perl | ~ 72 秒 | ~ 39 秒 | ~ 17 秒 |
| PHP | ~ 38 秒 | ~ 12 秒 | ~ 13 秒 |
結論:PHP 整體耗時約為 Perl 的 53%,快近 40%。
驗證:Perl 也有 Memcached::libmemcached (C 綁定),若用該模塊性能將大幅追平 PHP。
Memcache::set($key, $var, $flag, $expire) 可選長度參數,但內部實際以 strlen($var) 為準,不強制截斷。set($key, $value) 無長度參數,內部需自行計算字符串長度 (Perl 字符串長度屬性 O(1) 但屬性訪問有開銷)。同樣數據集下 get 操作 51.2 萬次:
讀取同樣呈現 PHP 約快 50% 的趨勢,確認是客戶端庫實現層面的系統性差距。
memcached (非 memcache) 或 redis 擴展;Perl 用 Memcached::libmemcached;Python 用 python-memcached (C) 或 pymemcache。getMulti/setMulti 減少網絡往返 (RTT)。igbinary、msgpack 比默認 serialize 快 2-3 倍、體積小 30-50%。「PHP 比 Perl 快」的本質是 C 寫的擴展 vs 純解釋器實現。語言本身不分快慢,關鍵路徑是否下沉到 C 層 才是性能分水嶺。選擇客戶端庫時,pecl search memcached 找 C 擴展版本是鐵律。