字符串连接符 “..”
当需要把多个小字符串拼接成一个大串的时候,例如,从一个sql结果集中取某列元素并将该元素组成以‘/’分割的字符串。
如果sql结果集是上万行,那么就会发现效率越来越低。这性能越来越低的原因是什么呢?这就要去追溯lua的垃圾收集算法,当Lua虚拟机发现程序使用太多的内存,它就会遍历它所有的数据结构,并进行释放它认为是垃圾的数据。一般情况下,这个算法有很好的性能,但下面的那段代码loop使得算法的效率极其低下。假设在loop中间,buff的大小已经是一个10kb的字符串, 一个sql结果中的所需要串连的成员的大小为10bytes, 那么buff .. row_tab.name .. “/” 新建的buff大小为10k+11bytes, 并且从buff中将10KB的字符串copy到新串中,也就是说每一行,都要移动10KB的内存,串连100行的时候(差不多1KB),Lua已经移动了1MB的内存。
也就是赋值语句中老的字符串变成了垃圾数据,两轮循环之后,将有两个老串包含超过20KB的垃圾数据,这个时候lua虚拟机会进行垃圾收集并释放这20KB的内存,问题在于,每两次循环就要进行一次垃圾收集,读取完一个sql结果集,所需的内存是原本内容的三倍。
而要获取最终的字符串,同时避免过多的垃圾回收,我们可以使用table.concat函数将一个列表的所有元素合并。
获取table的元素个数
当一个table为数组的时候,我们可能会使用以下两种用法中的一种,来获取该table的元素个数
我们修改table: