2010-04-20 9 views
6

इस प्रश्न का शीर्षक इतना स्पष्ट नहीं है, लेकिन कोड और प्रश्न सरल है।memcached: जो तेज़ है, एक जोड़ (और जांच परिणाम) कर रहा है, या एक प्राप्त कर रहा है (और झूठी लौटने पर सेट)

मान लें कि मैं प्रतिदिन एक बार अपने उपयोगकर्ताओं को एक विज्ञापन दिखाना चाहता हूं। इसे पूरा करने के लिए, हर बार जब वे मेरी साइट पर किसी पृष्ठ पर जाते हैं, तो मैं यह देखने के लिए जांच करता हूं कि किसी निश्चित मेमकेचे कुंजी पर कोई डेटा संग्रहीत है या नहीं। यदि ऐसा है, तो विज्ञापन न दिखाएं। यदि नहीं, तो 86400.

की एक समय समाप्ति के साथ कि कुंजी में मूल्य की दुकान '1' मैं इस 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 
} 

, यह स्पष्ट लग सकता है कि ख बेहतर है, यह हमेशा बना देता है 1 memcache कॉल। हालांकि, "ऐड" बनाम "प्राप्त करें" का ओवरहेड क्या है? ये वास्तविक तुलना नहीं हैं ... और मैंने अभी इन नंबरों को बनाया है, लेकिन मान लें कि 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 

क्या हमेशा कॉल कॉल करना समझदारी होगी? क्या यह एक अनावश्यक सूक्ष्म अनुकूलन है?

+0

अच्छा सवाल! आप हमेशा एक त्वरित परीक्षण केस लिख सकते हैं जो त्वरित तुलना करने के लिए 10000 बार दोनों विधियों को चलाता है ... – oedo

+1

यदि कैश एक संतुलित संतुलित बी-पेड़ है, तो कुंजी को संयोजित करने का प्रयास शायद लुकअप के प्रयास को बौछार करता है। और पृष्ठ की सेवा करने का प्रयास शायद यह कोड ब्रह्माण्ड नहीं होने पर आकाशगंगा आकाशगंगा को देखते समय ग्रह पृथ्वी की तरह दिखता है। –

उत्तर

3

यहाँ कुछ त्वरित और गंदे कोड मैं मार पड़ी है इस परीक्षण करने के लिए, अगर कोई रुचि है:

<?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

और परिणाम? –

+0

मशीनों के अपने समूह के लिए, बीट्स प्रति विज़िट के बारे में 22 पृष्ठों तक सेट/सेट करें ... उसके बाद, जीतें/जीतें। –

0

क्या आप जानते हैं कुंजी मौजूद है, तो यह शायद एक वेतन वृद्धि आपरेशन करने के लिए तेजी से हो सकता है और देखेंगे परिणाम है। यह उन लोगों की सीमित सीमा और थ्रॉटलिंग समस्याओं के समान है जो लोगों का सामना करते हैं; आप शायद यह जानकर एक अच्छी Google खोज तैयार कर सकते हैं।

संबंधित मुद्दे