前言
正在用NodeMCU做项目,Lua语言很快就能拿来用,比用C语言开发快很多.但是突出的问题便是内存溢出.以前使用stm32时从没遇到过这个问题,觉得c语言中的联合体是给上世纪的51用的.自从这个项目进行的很顺利的到达预期80%的功能的时候,突然内存溢出触发看门狗时,心态就炸了.先是花了几天优化,憋出了几k内存,但是是基于阉割了一些冗余代码的基础上.再经历了源码改动未果,Lua协程架构不能有效节省内存之后,开始研究NodeMCU的struct模块,可以与C语言的结构体进行交互.进而引发了我研究各种数据储存的内存使用情况的研究.
实验情况
测试一个空函数占用堆空间
heap0=0
heap1=0
heap0=node.heap()
function fun()
end
heap1=node.heap()
print('@heap',heap0,heap1,(heap0-heap1))
@heap 40576 40376 200
可以看出一个空函数占用200B堆空间
测试一个空表占用空间
heap0=0
heap1=0
heap0=node.heap()
s={}
heap1=node.heap()
print('@heap',heap0,heap1,(heap0-heap1))
@heap 40576 40496 80
测试在表中创建一个数字的内存开销
heap0=0
heap1=0
s={}
heap0=node.heap()
s[1]=1
heap1=node.heap()
print('@heap',heap0,heap1,(heap0-heap1))
@heap 40496 40432 64
测试单表储存数据开销是否平均
heap0=node.heap()
s={1,2,3,4,5,6,7,8,9,10,11,12,13}
heap1=node.heap()
n=13
print('@heap',heap0,heap1,(heap0-heap1-296-88)/n)
@heap 1 39936 39872 64
@heap 2 39936 39872 32
@heap 3 39936 39824 37.333333333333
@heap 4 39936 39824 28
@heap 5 39936 39824 22.4
@heap 6 39936 39760 29.333333333333
@heap 7 39936 39760 25.142857142857
@heap 8 39936 39760 22
@heap 9 39936 39760 19.555555555556
@heap 10 39936 39632 30.4
@heap 11 39936 39632 27.636363636364
@heap 12 39936 39632 25.333333333333
@heap 13 39936 39632 23.384615384615
@heap 14 39936 39632 21.714285714286
@heap 15 39936 39632 20.266666666667
@heap 16 39936 39632 19
@heap 17 39936 39632 17.882352941176
@heap 18 39936 39376 31.111111111111
@heap 19 39936 39376 29.473684210526
@heap 20 39936