Заголовок этого вопроса не является настолько четким, но код, и вопрос прост.
Скажем, я хочу показать моим пользователям рекламу однажды в день. Для выполнения этого, каждый раз, когда они посещают страницу на моем сайте, я проверяю, чтобы видеть, имеет ли определенный ключ кэш-памяти какие-либо данные, хранившие на нем. Если так, не показывайте рекламу. В противном случае сохраните значение '1' в том ключе с истечением 86 400.
Я могу сделать это 2 пути:
//version a
$key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
if($memcache->get($key)===false){
$memcache->set($key,'1',false,$expire);
//show ad
}
//version b
$key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
if($memcache->add($key,'1',false,$expire)){
//show ad
}
Теперь, могло бы казаться очевидным, что b лучше, это всегда выполняет 1 вызов кэш-памяти. Однако, каковы издержки, "добавляют" по сравнению с, "добираются"? Это не реальные сравнения..., и я просто составил эти числа, но скажем, 1 добавляют ~ =, 1 набор ~ = 5 добирается с точки зрения усилия, и средний пользователь просматривает 5 страниц в день:
a: (5 get * 1 effort) + (1 set * 5 effort) = 10 units of effort
b: (5 add * 5 effort) = 25 units of effort
Имело бы смысл всегда делать добавить вызов? Действительно ли это - ненужная микрооптимизация?
Вот какой быстрый и грязный код, который я придумал, чтобы проверить это, если кому-то интересно:
<?php
require('include.php');
$memcache = new Memcache();
foreach(Config::$CONFIG['memcache_server'] as $memcache_server){
$memcache->addServer($memcache_server,11211,false);
}
$iterations = 300;
$max_pages_per_visit = 25;
$time_now = microtime(true);
for($pages_per_visit = 1; $pages_per_visit<=$max_pages_per_visit; $pages_per_visit++){
foreach(array('gs','a') as $method){
$start = microtime(true);
for($x = 0; $x < $iterations; $x++){
$key = 'testmc'.$time_now.'_'.$pages_per_visit.'_'.$method.'_'.$x;
switch($method){
case 'gs':
for($y = 0 ; $y < $pages_per_visit; $y++){
if($memcache->get($key)===false){
$memcache->set($key,'1',null,5);
}
}
break;
case 'a':
for($y = 0 ; $y < $pages_per_visit; $y++){
$memcache->add($key,'1',null,5);
}
break;
}
}
$end = microtime(true);
$results[$pages_per_visit][$method] = $end - $start;
}
}
//print results
print('<pre>');
foreach($results as $pages_per_visit => $data){
$speed_diff = $data['gs'] - $data['a'];
$speed_percentage = round($speed_diff / $data['gs'] * 100,2);
echo($pages_per_visit.' pages : add is faster by :'.$speed_diff.' ('.$speed_percentage.')%'.PHP_EOL);
}
Если вы знаете, что ключ существует, то, вероятно, будет быстрее выполнить операцию инкремента и посмотреть на результат. Это похоже на проблемы ограничения скорости и дросселирования, с которыми сталкиваются люди; зная это, вы, вероятно, могли бы создать хороший поиск в Google.