[swift-users] Help! Slicing an array is very expensive

Howard Lovatt howard.lovatt at gmail.com
Tue May 9 02:53:33 CDT 2017


I find trimming relative to appending OK on my 6 year old MacBook Pro. EG:

import Foundation

func elapsed(s: DispatchTime, e: DispatchTime) -> Double {
    return Double(e.uptimeNanoseconds - s.uptimeNanoseconds) / 1_000_000_000
}

let s = 250_000_000
var a = [UInt8]()
a.reserveCapacity(s)

let sa = DispatchTime.now()
for i in 1 ... s {
    a.append(0)
}
let ea = DispatchTime.now()
print("Append time: \(elapsed(s: sa, e: ea)) s")

let st = DispatchTime.now()
let ha = a[0 ..< (s >> 1)]
let et = DispatchTime.now()
print("Trim time: \(elapsed(s: st, e: et)) s")

print("ha count: \(ha.count), capacity: \(ha.capacity)")


Prints:

Append time: 2.612397389 s
Trim time: 0.000444132 s
ha count: 125000000, capacity: 125000000


  -- Howard.

On 9 May 2017 at 12:56, Kelvin Ma via swift-users <swift-users at swift.org>
wrote:

> Depending on what you’re trying to do with the data, you might be better
> off using an UnsafeBufferPointer and allocating and reallocating that,
> C-style.
>
> On Mon, May 8, 2017 at 7:01 PM, Philippe Hausler via swift-users <
> swift-users at swift.org> wrote:
>
>> I wonder if Data might be a better tool for the job here since it is it’s
>> own slice type and would avoid copying large amounts of data into temporary
>> buffers.
>>
>> > On May 8, 2017, at 16:47, 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?
>> >
>> > Thanks,
>> >
>> > --
>> > Rick Mann
>> > rmann at latencyzero.com
>> >
>> >
>> > _______________________________________________
>> > swift-users mailing list
>> > swift-users at swift.org
>> > https://lists.swift.org/mailman/listinfo/swift-users
>>
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
>>
>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170509/7e78dabe/attachment.html>


More information about the swift-users mailing list