好的,因爲我一直在對緩存的查詢進行鍵控,而不是簡單地使用查詢字符串本身,所以我做了一個天真的基準測試。下面比較了使用普通的查詢字符串VS首先創建MD5哈希:
$ php -v
$ PHP 5.3.0-3 with Suhosin-Patch (cli) (built: Aug 26 2009 08:01:52)
$ ...
$ php benchmark.php
$ PHP hashing: 0.19465494155884 [microtime]
$ MD5 hashing: 0.57781004905701 [microtime]
$ 799994
代碼:
<?php
error_reporting(E_ALL);
$queries = array("SELECT",
"INSERT",
"UPDATE",
"DELETE",
);
$query_length = 256;
$num_queries = 256;
$iter = 10000;
for ($i = 0; $i < $num_queries; $i++) {
$q = implode('',
array_map("chr",
array_map("rand",
array_fill(0, $query_length, ord("a")),
array_fill(0, $query_length, ord("z")))));
$queries[] = $q;
}
echo count($queries), "\n";
$cache = array();
$side_effect1 = 0;
$t = microtime(true);
for ($i = 0; $i < $iter; $i++) {
foreach ($queries as $q) {
if (!isset($cache[$q])) {
$cache[$q] = $q;
}
else {
$side_effect1++;
}
}
}
echo microtime(true) - $t, "\n";
$cache = array();
$side_effect2 = 0;
$t = microtime(true);
for ($i = 0; $i < $iter; $i++) {
foreach ($queries as $q) {
$md5 = md5($q);
if (!isset($cache[$md5])) {
$cache[$md5] = $q;
}
else {
$side_effect2++;
}
}
}
echo microtime(true) - $t, "\n";
echo $side_effect1 + $side_effect2, "\n";
我認爲把準備好的語句句柄放在一個數組中,用SQL作爲鍵是唯一的方法。我認爲你提出的其他方法沒有任何好處。然而,我很想知道PDO是否自動進行這種優化...... – Inshallah 2010-01-25 13:29:12
但是,如果查詢是一個很長的並且被稱爲數千次,那麼在數組中查找這樣一個鍵將成爲它自己的IMO的瓶頸。 – raveren 2010-01-25 13:43:24
我不知道。我可能完全錯誤。我對PHP數組內部知識不夠了解,從未測試過這個級別的性能。順便說一句,這是一個好主意,在實施之前測試各種方式的性能。 – Inshallah 2010-01-25 13:46:30