精读《手写 SQL 编译器 - 性能优化之缓存》

栏目: 数据库 · 发布时间: 7年前

内容简介:重回 “手写 SQL 编辑器” 系列。这次介绍如何利用缓存优化编译器执行性能。可以利用本文会用到一些图做解释,下面介绍图形规则:

1 引言

重回 “手写 SQL 编辑器” 系列。这次介绍如何利用缓存优化编译器执行性能。

可以利用 Frist 集Match 节点缓存 这两种方式优化。

本文会用到一些图做解释,下面介绍图形规则:

精读《手写 SQL 编译器 - 性能优化之缓存》

First 集优化,是指在初始化时, 将整体文法的 First 集找到,因此在节点匹配时,如果 Token 不存在于 First 集中,可以快速跳过这个文法 ,在文法调用链很长,或者 “或” 的情况比较多时,可以少走一些弯路:

精读《手写 SQL 编译器 - 性能优化之缓存》

如图所示,只要构建好了 First 集, 不论这个节点的路径有多长,都可以以最快速度判断节点是否不匹配 。如果节点匹配,则继续深度遍历方式访问节点。

现在节点不匹配时性能已经最优,那下一步就是如何优化匹配时的性能,这时就用到 Match 节点缓存。

Match 节点缓存,指在运行时,缓存节点到其第一个终结符的过程。与 First 集相反,First 集可以快速跳过,而 Match 节点缓存可以快速找到终结符进行匹配,在非终结符很多时,效果比较好:

精读《手写 SQL 编译器 - 性能优化之缓存》

如图所示,当匹配到节点时,如果已经构建好了缓存,可以直接调到真正匹配 Token 的 Match 节点,从而节省了大量节点遍历时间。

这里需要注意的是,由于 Tree 节点存在分支可能性,因此缓存也包含将 “沿途” Chances 推入 Chances 池的职责。

2 精读

那么如何构建 First 集与 Match 节点缓存呢?通过两张图解释。

构建 First 集

精读《手写 SQL 编译器 - 性能优化之缓存》

如图所示,构建 First 集是个自下而上的过程,当访问到 MatchNode 节点时,就可以收集作为 父节点的 First 集了!父集判断 First 集收集完毕的话,就会触发它的父节点 First 集收集判断,如此递归,最后完成 First 集收集的是最顶级节点。

构建 Match 节点缓存

精读《手写 SQL 编译器 - 性能优化之缓存》

如图所示,访问节点时,如果没有缓存,则会将这个节点添加到 Match 缓存查找队列 ,同时路途遇到 TreeNode,也会将下一个 Chance 添加到缓存查找队列。直到遇到了第一个 MatchNode 节点,则这个节点是 “Match 缓存查找队列” 所有节点的 Match 节点缓存,此时这些节点的缓存就可以生效了,指向这个 MatchNode,同时清空缓存查找队列,等待下一次查找。

3 总结

select a, b, c, d from e 这个语句做测试:

node 节点访问次数 Frist 集优化 First 集 + Match 节点缓存优化
784 669 652

从这个简单 Demo 来看,提效了 16% 左右。不过考虑到文法结构会影响到提效,对于层级更深的文法、能激活深层级文法的输入可以达到更好的效率提升。

4 更多讨论

讨论地址是: 精读《手写 SQL 编译器 - 性能优化之缓存》 · Issue #110 · dt-fe/weekly

如果你想参与讨论,请 点击这里 ,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。


以上所述就是小编给大家介绍的《精读《手写 SQL 编译器 - 性能优化之缓存》》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆点

引爆点

[美] 马尔科姆·格拉德威尔 / 钱清、覃爱冬 / 中信出版社 / 2006-1 / 29.80元

这本书是《纽约客》杂志专职作家马尔科姆·格拉德威尔的一部才华横溢之作。他以社会上突如其来的流行风潮研究为切入点,从一个全新的角度探索了控制科学和营销模式。他认为,思想、行为、信息以及产品常常会像传染病爆发一样,迅速传播蔓延。正如一个病人就能引起一场全城流感;如果个别工作人员对顾客大打出手,或几位涂鸦爱好者管不住自己,也能在地铁里掀起一场犯罪浪潮;一位满意而归的顾客还能让新开张的餐馆座无虚席。这些现......一起来看看 《引爆点》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具