Published on

lua原生pairs和自定义的c迭代器

今天起床突然在想一个问题,之前每次写luaclib的时候,lua想要获取c的数据,我都是提供一个接口,把数据完成返回给lua,然后lua遍历数据读取。

那么如果我直接通过c返回一个迭代器,lua直接迭代数据,而不是先拿到数据然后再pairs遍历,这样会不会快一些。

我写了段代码测试了一下。 测试结果是, 两种方案差不多。差距基本可以忽略不计。

lua从c获取一千万数据,然后ipairs遍历,总时长平均是0.23。

直接用迭代器迭代一千万数据,总时长平均是0.19。

c返回迭代器快一点点,不过一千万的数据也就只有0.04s的差距。

想了想,也是正常的,因为实际上该做的事情没少什么,除了不需要lua_createtable,迭代器也是要每次用lua_push压入数据。

不过这里也是有一点小技巧可以拉开更大差距, 比如我每次返回两个值,例如

for _, a, b in c.iter() do
end

这里每次返回两个,可以把c调用次数直接砍半, 测试的平均时长到了0.13, 这里还可以一次性返回更多, 例如4个。

当然一次性返回更多也不方便使用, 不过只有2个或者4个这种, 刚好可以符合某种成对成组返回的数据, 这样的话比每次迭代创建一个table,在table里面插入这组数据的方式要好