NodeMCUのメモリテストについて


前言
NodeMCUでプロジェクトをしていますが、Lua言語はすぐに使えます.C言語で開発するよりずっと速いです.しかし、メモリオーバーフローが顕著な問題である.以前stm 32を使用したときにこの問題に遭遇したことがなく、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空関数が200 Bスタックの空間を占有していることがわかる
空きテーブルの空き容量をテスト
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
関数にテーブルを使用して数字を格納し、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