今天起床突然在想一个问题,之前每次写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里面插入这组数据的方式要好