今天花了一天尝试给 lua vm 做了一点优化:现在 lua 的函数原型里保留有一张常量表,引用了 string ,number ,nil ,boolean 类型的常量。table 是不能为常量的,所以当你想迭代一个常量数组的时候,for _, v in ipairs { "one", "two", "three" } do其实每次都会临时构建一张表,并依次插入 "one", "two", "three" 。或者你想返回一个常量构成的表:function foo()
return { x=1, y=2 }
end每次 foo 函数都会为返回值重新构建 table 。其实,我们可以认为所有键值都是常量的 table ,都有可能是一个常量表。那么,在 parser 阶段,和 string 等类型一样,预先建立好 table 对象,保留在 prototype 的常量表中,可以极大的提高运行性能。那么在上面这种return {x=1, y=2}的写法中,实际返回的可以仅仅是一个 table proxy ,里面只有一个指向常量表的指针即可。如果事后我们真的需要改写这个 table ,再 clone 一份常量表,把这个 table proxy 对象还原成真正的 table 对象即可。也就是所谓的 COW 技术。由于常量表一定是一个单层简单表结构,可以直接 memcpy 复制,比一项项添加
...
继续阅读
(62)