关于NodeMCU的内存测试

前言

正在用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   39376   28
@heap   21  39936   39376   26.666666666667
@heap   22  39936   39376   25.454545454545
@heap   23  39936   39376   24.347826086957
@heap   24  39936   39376   23.333333333333
@heap   25  39936   39376   22.4
@heap   26  39936   39376   21.538461538462
@heap   27  39936   39376   20.740740740741
@heap   28  39936   39376   20
@heap   29  39936   39376   19.310344827586
@heap   30  39936   39376   18.666666666667
@heap   31  39936   39376   18.064516129032
@heap   32  39936   39376   17.5
@heap   33  39936   39376   16.969696969697
@heap   34  39936   38864   31.529411764706
@heap   35  39936   38864   30.628571428571
@heap   36  39936   38864   29.777777777778
@heap   37  39936   38864   28.972972972973
@heap   38  39936   38864   28.210526315789
@heap   39  39936   38864   27.487179487179
@heap   40  39936   38864   26.8
@heap   41  39936   38864   26.146341463415
@heap   42  39936   38864   25.52380952381
@heap   43  39936   38864   24.93023255814
@heap   44  39936   38864   24.363636363636
@heap   45  39936   38864   23.822222222222
@heap   46  39936   38864   23.304347826087
@heap   47  39936   38864   22.808510638298
@heap   48  39936   38864   22.333333333333
@heap   49  39936   38864   21.877551020408
@heap   50  39936   38864   21.44
@heap   51  39936   38864   21.019607843137
@heap   52  39936   38864   20.615384615385
@heap   53  39936   38864   20.22641509434
@heap   54  39936   38864   19.851851851852
@heap   55  39936   38864   19.490909090909
@heap   56  39936   38864   19.142857142857
@heap   57  39936   38864   18.80701754386
@heap   58  39936   38864   18.48275862069
@heap   59  39936   38864   18.169491525424
@heap   60  39936   38864   17.866666666667
@heap   61  39936   38864   17.573770491803
@heap   62  39936   38864   17.290322580645
@heap   63  39936   38864   17.015873015873
@heap   64  39936   38864   16.75
@heap   65  39936   38864   16.492307692308
@heap   66  39936   37840   31.757575757576
@heap   67  39936   37840   31.283582089552
@heap   68  39936   37840   30.823529411765
@heap   69  39936   37840   30.376811594203
@heap   70  39936   37840   29.942857142857
@heap   71  39936   37840   29.521126760563
@heap   72  39936   37840   29.111111111111
@heap   73  39936   37840   28.712328767123
@heap   74  39936   37840   28.324324324324
@heap   75  39936   37840   27.946666666667
@heap   76  39936   37840   27.578947368421
@heap   77  39936   37840   27.220779220779
@heap   78  39936   37840   26.871794871795
@heap   79  39936   37840   26.53164556962
@heap   80  39936   37840   26.2
@heap   81  39936   37840   25.876543209877
@heap   82  39936   37840   25.560975609756
@heap   83  39936   37840   25.253012048193
@heap   84  39936   37840   24.952380952381
@heap   85  39936   37840   24.658823529412
@heap   86  39936   37840   24.372093023256
@heap   87  39936   37840   24.091954022989
@heap   88  39936   37840   23.818181818182
@heap   89  39936   37840   23.550561797753
@heap   90  39936   37840   23.288888888889
@heap   91  39936   37840   23.032967032967
@heap   92  39936   37840   22.782608695652
@heap   93  39936   37840   22.537634408602
@heap   94  39936   37840   22.297872340426
@heap   95  39936   37840   22.063157894737
@heap   96  39936   37840   21.833333333333
@heap   97  39936   37840   21.60824742268
@heap   98  39936   37840   21.387755102041
@heap   99  39936   37840   21.171717171717
@heap   100 39936   37840   20.96

结论是不可知,时而减少,时而增多,可以设计函数统计下,但是Lua的内存查看比较麻烦,不容易控制.

测试变量储存单数据

heap0=node.heap()
s1=1
s2=2
s3=3
s4=4
s5=5
s7=7
s8=8
s9=9
s10=10
s11=11
s12=12
s13=13
heap1=node.heap()
print('@heap',heap0,heap1,(heap0-heap1-296)/13)

@heap 40864 39672 68.923076923077
同样的内存变化不确定,时而减少,时而增多.

在函数中单变量储存数字

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1=1
     s2=2
     s3=3
     s4=4
     s5=5
     s6=6
     s7=7
     s8=8
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 39752 824

当我把数据增大一些,可用堆竟然增加了

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1=100000000000000
     s2=200000000000000
     s3=300000000000000
     s4=400000000000000
     s5=500000000000000
     s6=600000000000000
     s7=700000000000000
     s8=800000000000000
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 39800 776

函数中表储存数字

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s={1,2,3,4,5,6,7,8}
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 40160 416
初步发现占用空间比单变量储存数据更少.

函数中单变量储存字符串

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1='1'
     s2='2'
     s3='3'
     s4='4'
     s5='5'
     s6='6'
     s7='7'
     s8='8'
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 39568 1008

在函数中使用表储存数字,直接打印字面量

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1={1,2,3,4,5,6,7,8}
     print(1,2,3,4,5,6,7,8)
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 40072 504

扫描二维码关注公众号,回复: 1056445 查看本文章

在函数中使用表储存数字,通过index打印出来

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1={1,2,3,4,5,6,7,8}
     print(s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8])
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 39984 592

使用pairs函数打印

heap0=0
heap1=0
heap0=node.heap()
function fun()
     s1={1,2,3,4,5,6,7,8}
     for k,v in ipairs(s1) do
        print(k,v)
     end
end
heap1=node.heap()
print('@heap',heap0,heap1,heap0-heap1)

@heap 40576 40048 528

猜你喜欢

转载自blog.csdn.net/qq_37258787/article/details/79942561