虽然我了解 apc_store 和 apc_add 之间的区别,但我想知道使用其中一个或另一个是否有任何性能优势?
有人会认为 apc_store 可能会更快一些,因为它不需要在插入之前进行检查是否存在。
我的想法正确吗?
或者在我们确定该条目不存在的情况下使用 apc_add 会更快一些?
Short:apc_store()
应该比apc_add()
.
更长:两者之间的唯一区别是exclusive
传递给apc_store_helper()
that 的标志依次导致apc_cache_insert()
.
这是那里发生的事情:
if (((*slot)->key.h == key.h) && (!memcmp((*slot)->key.str, key.str, key.len))) {
if(exclusive) {
if (!(*slot)->value->ttl || (time_t) ((*slot)->ctime + (*slot)->value->ttl) >= t) {
goto nothing;
}
}
// THIS IS THE MAIN DIFFERENCE
apc_cache_remove_slot(cache, slot TSRMLS_CC);**
break;
} else
if((cache->ttl && (time_t)(*slot)->atime < (t - (time_t)cache->ttl)) ||
((*slot)->value->ttl && (time_t) ((*slot)->ctime + (*slot)->value->ttl) < t)) {
apc_cache_remove_slot(cache, slot TSRMLS_CC);
continue;
}
slot = &(*slot)->next;
}
if ((*slot = make_slot(cache, &key, value, *slot, t TSRMLS_CC)) != NULL) {
value->mem_size = ctxt->pool->size;
cache->header->mem_size += ctxt->pool->size;
cache->header->nentries++;
cache->header->ninserts++;
} else {
goto nothing;
}
主要区别在于,apc_add()
如果该值已经存在,则可以节省一个槽删除。现实世界的基准测试显然对确认该分析很有意义。