在 Swoole 4.5 版本中我们对 Table 模块进行了一些优化,解决了过去一些查询失败的问题,性能得到提升。
1. KEY 对比
在之前版本中使用了 strcmp 进行比较,新版使用了 sw_mem_equal 函数比较 KEY 字符串相等。sw_mem_equal 接受 4 个参数,A/B 字符串均需要传入长度,带来的好处是:
- 支持了 KEY 的 二进制 安全,可以使用二进制数据作为 Table 的 KEY
- 字符串长度不相等时,直接返回 false,不需要对比内容
if (sw_mem_equal(row->key, row->key_len, key, keylen))
{
if (!row->active)
{
row = NULL;
}
break ;
}
2. HASH 函数
4.5 版本中 Table 可以外部设置 hash 函数,默认使用了最新版本的 PHP Array hash 函数,性能更高,碰撞率更低。
table = swTable_new(table_size, conflict_proportion);
if (table == NULL)
{
zend_throw_exception(swoole_exception_ce, "global memory allocation failure", SW_ERROR_MALLOC_FAIL);
RETURN_FALSE;
}
table->hash_func = [](const char *key, size_t len) -> uint64_t {
zend_string *string = (zend_string *) (key - offsetof(zend_string, val));
return zend_string_hash_val(string);
};
php_swoole_table_set_ptr(ZEND_THIS, table);
这里有一个重要的优化,底层使用了 zend_string_hash_val ,当 PHP 层传入的 KEY 已经计算过 Hash 值,就可以直接返回 zend_string->h ,不再需要进行 hash 计算。
这里利用了 PHP7 新的 HashTable 优化,可以节省很多不必要的 hash 函数调用 。
这里小编也准备了完整的swoole基础到实战视频。
领取方式:点赞关注小编后私信【资料】获取资料领取方式!
部分资料展示:
领取方式:点赞关注小编后私信【资料】获取资料领取方式!
海报
0 条评论
186
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~