文件名称:对元方法的优化-从0到1抖音运营变现手册大全
文件大小:2.13MB
文件格式:PDF
更新时间:2024-06-27 10:40:15
lua
4.4 对元方法的优化 界畵畡 实现复杂数据结构,大量依赖给 畴畡畢畬略 附加一个元表( 畭略畴畡畴畡畢畬略 )来实现。故而 畴畡畢畬略 本身的一大 作用就是作为元表存在。查询元表中是否存在一个特定的元方法就很容易成为运行期效率的热点。如果不能 高效的解决这个热点,每次对带有元表的 畴畡畢畬略 的操作,都需要至少多作一次 畨畡畳畨 查询。但是,并非所有 元表都提供了所有元方法的,对于不存在的元方法查询就是一个浪费了。 在 源代码甴甮由 中,我们可以看到,每个 畔畡畢畬略 结构中都有一个 甍畡畧畳 域。它记录了那些元方法不存在。 畬畴畡畢畬略甮畨 里定义了一个宏: 由 #define invalidateTMcache(t) ((t)->flags = 0) 这个宏用来在 畴畡畢畬略 被修改时,清空这组标记位,强迫重新做元方法查询。只要充当元表10的 畴畡畢畬略 没有 被修改,缺失元方法这样的查询结果就可以缓存在这组标记位中了。 源代码 甴甮由甴町 畬畴畭甮畨町 畦畡畳畴畴畭 甴由 #define gfasttm(g,et,e) ((et) == NULL ? NULL : \ 甴甲 ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et , e, (g)->tmname[e])) 甴申 甴甴 #define fasttm(l,et,e) gfasttm(G(l), et, e) 我们可以看到 畦畡畳畴畴畭 这个宏能够快速的剔除不存在的元方法。 另一个优化点是,不必在每次做元方法查询的时候都压入元方法的名字。在 畳畴畡畴略 初始化时,畬畵畡 对这些 元方法生成了字符串对象: 源代码 甴甮由电町 畬畴畭甮畣町 畩畮畩畴 10lua 5.2 仅对 table 的元表做了这个优化,而没有理会其它类型的元表的元方法查询。这大概是因为,只有 table 容易缺失一些诸如 __index 这 样的元方法,而使用 table 的默认行为。当 lua 代码把这些操作作用于其它类型如 userdata 时,它没有 table 那样的默认行为,故对应的元方法通 常存在。