2010-04-20 13 views
6

Tiêu đề của câu hỏi này không phải là quá rõ ràng, nhưng mã và câu hỏi là đơn giản.memcached: đó là nhanh hơn, làm thêm (và kiểm tra kết quả), hoặc làm một get (và thiết lập khi trở về false)

Giả sử tôi muốn hiển thị cho người dùng của tôi một quảng cáo một lần mỗi ngày. Để thực hiện điều này, mỗi khi họ truy cập một trang trên trang web của tôi, tôi kiểm tra xem một khóa memcache nào đó có bất kỳ dữ liệu nào được lưu trữ trên đó hay không. Nếu có, không hiển thị quảng cáo. Nếu không, lưu trữ các giá trị '1' trong quan trọng mà với thời hạn của 86400.

tôi có thể làm điều này 2 cách:

//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ây giờ, nó có vẻ rõ ràng rằng b là tốt hơn, nó luôn luôn làm cho 1 cuộc gọi memcache. Tuy nhiên, chi phí của "thêm" so với "nhận" là gì? Đây không phải là những so sánh thực sự ... và tôi chỉ tạo ra những con số này, nhưng giả sử 1 thêm ~ = 1 bộ ~ = 5 lấy về nỗ lực và lượt xem trung bình của người dùng 5 trang mỗi ngày:

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

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

Bạn có nên thực hiện thêm cuộc gọi không? Đây có phải là tối ưu hóa vi mô không cần thiết không?

+0

câu hỏi hay! bạn luôn có thể viết một trường hợp thử nghiệm nhanh chạy cả hai phương pháp 10000 lần để so sánh nhanh chóng ... – oedo

+1

Nếu bộ nhớ cache là một cây b cân bằng tốt, nỗ lực của việc nối khóa có thể làm giảm khả năng tra cứu. Và nỗ lực phục vụ trang có thể làm cho mã này trông giống như hành tinh trái đất khi xem thiên hà Milky Way nếu không phải là vũ trụ. –

Trả lời

3

Dưới đây là một số mã nhanh chóng và dơ bẩn Tôi whipped lên để kiểm tra điều này, nếu có ai quan tâm:

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

Và kết quả? –

+0

Đối với cụm máy của tôi, hãy thêm nhịp đập/thiết lập cho đến khi khoảng 22 trang mỗi lượt truy cập ... Sau đó, nhận/đặt thắng. –

0

Nếu bạn biết chính tồn tại, nó có lẽ sẽ nhanh hơn để làm một hoạt động tăng và nhìn vào các kết quả. Điều này tương tự như tỷ lệ giới hạn và điều chỉnh vấn đề mà mọi người gặp phải; bạn có thể tạo một tìm kiếm tốt trên Google khi biết điều đó.

Các vấn đề liên quan