[swift-users] Help! Slicing an array is very expensive
Rick Mann
rmann at latencyzero.com
Wed May 10 14:07:30 CDT 2017
> On May 10, 2017, at 11:52 , Joe Groff <jgroff at apple.com> wrote:
>
>
>> On May 8, 2017, at 4:47 PM, Rick Mann via swift-users <swift-users at swift.org> wrote:
>>
>> I have this C library that interacts with some hardware over the network that produces a ton of data. It tells me up front the maximum size the data might be so I can allocate a buffer for it, then does a bunch of network requests downloading that data into the buffer, then tells me when it's done and what the final, smaller size is.
>>
>> Thanks to previous discussions on the list, I settled on using a [UInt8] as the buffer, because it let me avoid various .withUnsafePointer{} calls (I need the unsafe buffer pointer to live outside the scope of the closures). Unfortunately, When I go to shrink the buffer to its final size with:
>>
>> self.dataBuffer = Array(self.dataBuffer![0 ..< finalBufferSize])
>>
>> This ends up taking over 2 minutes to complete (on an iPad Pro). finalBufferSize is very large, 240 MB, but I think it's doing a very naive copy.
>>
>> I've since worked around this problem, but is there any way to improve on this?
>
> `self.dataBuffer!.removeSubrange(finalBufferSize ..< self.dataBuffer!.endIndex)` might be more efficient. However, copying an array of bytes definitely shouldn't be that slow, so is worth a bug report.
>
> -Joe
Here you go: https://bugs.swift.org/browse/SR-4856
Easy to reproduce in a Playground.
--
Rick Mann
rmann at latencyzero.com
More information about the swift-users
mailing list