-
-
Notifications
You must be signed in to change notification settings - Fork 746
Memory Management
On a NodeMCU, a program that only has the following line:
setTimeout("print(process.memory());", 1);
Yields this memory profile:
{ "free": 992, "usage": 31, "total": 1023, "history": 11 }
According to Espruino Internals, each memory unit is 12 bytes, so we start with something like 12k of memory.
m='';
setTimeout("print(process.memory());", 1);
{ "free": 991, "usage": 32, "total": 1023, "history": 14 }
The data is stored as a linked list in memory, so the variable itself is one block (>4 char var names take more 12 byte blocks).
Hint: Keep your variable names to a max of 4 characters.
It is not clear where the language elements =
and ;
are stored. (needs an answer)
m='012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
print(process.memory());
{ "free": 966, "usage": 57, "total": 1023, "history": 37 }
This is 240 char string takes 360 bytes to store. That is a 50% penalty. According to Espruino Performance It should take Each 12 Bytes should take 16 Bytes
Hint: Minimize the length of variables holding strings.
t='';
if (t==='');
setTimeout("print(process.memory());", 1);
{ "free": 990, "usage": 33, "total": 1023, "history": 20 }
now lets see if t is equal to a 240 char literal:
t='';
if (t==='012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789');
setTimeout("print(process.memory());", 1);
{ "free": 990, "usage": 33, "total": 1023, "history": 20 }
Hint: Literal should be used instead of variables when possible.
If you create more than 256 variables, then Espruino needs 16 bytes per variable.
Regular Javascript arrays Take 2 blocks per value element. There are non-Javascript typed arrays that are more efficient if you data fits the pattern (all Integers, etc.). A small Integer can type one Block per element. See Espruino Performance.
Javascript Objects can be even less memory efficient. Assuming 12 Byte blocks, If your Object index is > 8 bytes, it takes two or more blocks just for the index.
You can see how much memory an element takes using E.getSizeOf(...):
Hint: Carefully engineer JSON objects or replace them with typed Arrays.
String.fromCharCode()
If you have something like this scattered throughout your program, make a short named function.
When you create functions, give them short names. This is mitigated (actually rendered unnecessary if you turn on Closure [Simple Optimizations] in the Minification part of the IDE).