2010-04-20 3 views
6

Der Titel dieser Frage ist nicht so klar, aber der Code und die Frage ist einfach.memcached: was ist schneller, tun ein Add (und Prüfungsergebnis), oder ein get (und gesetzt, wenn falsch)

Angenommen, ich möchte meinen Nutzern einmal pro Tag eine Anzeige zeigen. Um dies zu erreichen, überprüfe ich bei jedem Besuch einer Seite auf meiner Seite, ob auf einem bestimmten Memcache-Schlüssel Daten gespeichert sind. Wenn dies der Fall ist, zeigen Sie keine Anzeige an. Wenn nicht, speichern Sie den Wert ‚1‘ in diesem Schlüssel mit einem Ablauf von 86400

ich diese 2 Arten tun:

//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 
} 

Nun könnte es offensichtlich scheint, dass b besser ist, macht es immer 1 Memcache-Anruf. Wie hoch ist der Overhead von "add" vs. "get"? Dies sind nicht die echten Vergleiche ... und ich habe nur diese Zahlen erfunden, aber sagen wir 1 hinzufügen ~ = 1 Satz ~ = 5 bekommen in Bezug auf Aufwand, und der durchschnittliche Benutzer sieht 5 Seiten pro Tag:

a: (5 get * 1 effort) + (1 set * 5 effort) = 10 units of effort 

b: (5 add * 5 effort) = 25 units of effort 

Wäre es sinnvoll, den Add-Call immer auszuführen? Ist das eine unnötige Mikrooptimierung?

+0

gute Frage! Sie könnten immer einen schnellen Testfall schreiben, der beide Methoden 10000 Mal ausführt, um einen schnellen Vergleich zu erhalten ... – oedo

+1

Wenn der Cache ein ausgewogener B-Baum ist, wird der Aufwand für die Suche wahrscheinlich durch den Aufwand der Verkettung des Schlüssels gering gehalten. Und die Mühe, die Seite zu bedienen, macht diesen Code wahrscheinlich so, als ob er den Planeten Erde sehen würde, wenn er die Milchstraße, wenn nicht das Universum, ansieht. –

Antwort

3

Hier einige quick and dirty Code, den ich dies zu testen aufgepeitscht, wenn jemand interessiert ist:

<?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); 
} 
+2

Und die Ergebnisse? –

+0

Für meine Gruppe von Maschinen, fügen Sie Beats get/set bis ca. 22 Seiten pro Besuch ... Danach gewinne/setzen gewinnt. –

0

Wenn Sie der Schlüssel vorhanden ist weiß, es wäre wahrscheinlich schneller sein, eine Inkrementbetrieb zu tun und bei der Suche Ergebnisse. Dies ist vergleichbar mit den Ratenbegrenzungs- und Drosselungsproblemen, denen Menschen begegnen; Sie könnten wahrscheinlich eine gute Google-Suche erstellen.

Verwandte Themen