Swoole 4.5 对 Table 的优化,你知道吗?

2022-10-11 21:15:21 186 0
魁首哥

在 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
上一篇:大神教你:xdebug和最重要的php调试技巧 下一篇:PHP入门读书笔记(十二):正则表达式函数

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码