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
  • Let's assume the original longArray were preallocated using:

    var longArray =new [32768]b;

    Why could there not be a native CIQ function that takes a 1K myArray and adds it to longArray 32 times without using more than 33K? Basically, it could do in native code what this loop does if the watchdog didn't time out:

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

    The above loop is memory efficient but not time efficient, but CIQ native code could improve this.

Comment
  • Let's assume the original longArray were preallocated using:

    var longArray =new [32768]b;

    Why could there not be a native CIQ function that takes a 1K myArray and adds it to longArray 32 times without using more than 33K? Basically, it could do in native code what this loop does if the watchdog didn't time out:

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

    The above loop is memory efficient but not time efficient, but CIQ native code could improve this.

Children
No Data