Hi Alexandr,

Equating struct creation with “cheap” or “fast" just because they’re structs 
isn’t a good idea in Swift. In general, struct creation itself is extremely 
fast by comparison to creating classes, yes, but it would be incorrect to say 
“all structs are fast, and all classes are slow”. Structs can hold a 
significant performance implication as well, though they can also be much 
faster than classes are too. It depends what the struct does under the hood.

Creating an array allocates a reference based buffer as an internal variable. 
This means, practically, it is just as slow as a class allocation. The 
important difference, however, is that structs allow us to share references as 
pointers under the hood just like classes do. And thus, we can make copies all 
over the place of the array where we don’t mutate, and have practically fixed 
cost, because there’s only really one reference - the initial buffer. Then once 
a mutation happens, the first mutation has a cost and then subsequent mutations 
drop in cost again.

Structs as wrappers of stack-based variables like Ints, Doubles, Booleans, etc 
are indeed far cheaper than Classes, yes. But just because it’s a struct 
doesn’t implicitly make it more performant.

In the case of Date(), Date is a struct that contains a single TimeInterval 
variable. The only expense apart from the very cheap struct creation is getting 
the actual date double, which is done with CFAbsoluteTimeGetCurrent(). This 
means the only expense apart from the very cheap struct creation is calling 
that C function to get the absolute time.

I can’t categorically state the comparison of Date vs NSDate creation. NSDate 
also uses tagged pointers in 64bit on ARM, for example, which avoids an 
allocation where possible by storing the date value inside the pointer.

Ultimately, you aren’t going to get a categorical answer about Structs vs 
Classes. They each have trade offs and optimisations. The best bet: use the 
right tool for the job, and then work out if what you’re doing has a 
performance issue and work from there.

- Rod


> On 13 Dec 2017, at 2:16 am, Седых Александр via swift-users 
> <swift-users@swift.org> wrote:
> 
> Hello.
> 
> For example we have
> 
> Class A {}
> Struct B {}
> 
> And code 'let b = B()' will do much faster than code 'let a = A()'
> And therefore code 'let d = Date()' is fast, because Date is struct?
> And I can use it in huge cycles fearlessly?
> 
> 
> 
> 
> -- 
> Alexandr Sedykh
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to