Acknowledged

ByteArray addAll() not Memory Efficient

When using the addAll() method of Lang.ByteArray, peak memory usage implies that the ConnectIQ framework is doubling the size of the array being appended to instead of extending it by the size of the appended array.

For example, let's say we create a 1K byteArray called myArray and run the following code starting with an empty byte array, longByteArray:

while(longByteArray.size() < 32768) {
    longByteArray.addAll(myArray);
}

An efficient implementation would grow peak memory usage by ~1K more than longByteArray.size(). Instead, we see peak memory usage growing with longByteArray.size() * 2 + 1024.

It may also be worth noting that the Monkey C extension for Visual Studio code will time out as the array grows if a developer sets a breakpoint on the addAll function above while the watch window is open to longByteArray.

Parents
  • I'm not sure I follow. If I preallocate an 8K array and rubber stamp a 1K array 8 times, the peak memory usage looks fine:

    for(var j = 0; j < 8; j++) {
        for(var i = 0; i < 1024; i++) {
            longByteArray[(j << 10) + i] = myArray[i];
        }
    }

    The exact sizes here (8K vs. 32K) don't really matter - the point is that CIQ could provide a native function for assigning blocks to a preallocated array without using more memory than is necessary. The above loop proves that it is possible to do this in VM code (running this in the simulator I see peak memory usage about 1K above total memory usage), so it should be possible for CIQ to the same in native code.

Comment
  • I'm not sure I follow. If I preallocate an 8K array and rubber stamp a 1K array 8 times, the peak memory usage looks fine:

    for(var j = 0; j < 8; j++) {
        for(var i = 0; i < 1024; i++) {
            longByteArray[(j << 10) + i] = myArray[i];
        }
    }

    The exact sizes here (8K vs. 32K) don't really matter - the point is that CIQ could provide a native function for assigning blocks to a preallocated array without using more memory than is necessary. The above loop proves that it is possible to do this in VM code (running this in the simulator I see peak memory usage about 1K above total memory usage), so it should be possible for CIQ to the same in native code.

Children
No Data