I’m testing sorted(by:)
time consuming in iPhone 14 real device and found that sorting @Model
types is x100 times more slower…. Why?
<code> Button("sort 50K [Int]"){
var numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
numbers.sort()
print("Elapsed time to sort 50K Ints: (Date.now.timeIntervalSince(startTime))") // 0.06...
}
Button("sorted 50K [Int]"){
let numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
let sortedNumbers = numbers.sorted()
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [NoPersistedItem]"){
let items = Array(0..<50_000).shuffled().map{NoPersistedItem(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [PersistedItems]"){
let items: [Item] = Array(0..<50_000).shuffled().map{Item(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Persisted Items: (Date.now.timeIntervalSince(startTime))")// 5.3...
}
</code>
<code> Button("sort 50K [Int]"){
var numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
numbers.sort()
print("Elapsed time to sort 50K Ints: (Date.now.timeIntervalSince(startTime))") // 0.06...
}
Button("sorted 50K [Int]"){
let numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
let sortedNumbers = numbers.sorted()
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [NoPersistedItem]"){
let items = Array(0..<50_000).shuffled().map{NoPersistedItem(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [PersistedItems]"){
let items: [Item] = Array(0..<50_000).shuffled().map{Item(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Persisted Items: (Date.now.timeIntervalSince(startTime))")// 5.3...
}
</code>
Button("sort 50K [Int]"){
var numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
numbers.sort()
print("Elapsed time to sort 50K Ints: (Date.now.timeIntervalSince(startTime))") // 0.06...
}
Button("sorted 50K [Int]"){
let numbers = Array(0..<50_000).shuffled()
let startTime = Date.now
let sortedNumbers = numbers.sorted()
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [NoPersistedItem]"){
let items = Array(0..<50_000).shuffled().map{NoPersistedItem(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Ints: (Date.now.timeIntervalSince(startTime))")// 0.06...
}
Button("sorted 50K [PersistedItems]"){
let items: [Item] = Array(0..<50_000).shuffled().map{Item(value: $0)}
let startTime = Date.now
let sortedItems = items.sorted(by: {$0.value<$1.value})
print("Elapsed time to sorted 50K Persisted Items: (Date.now.timeIntervalSince(startTime))")// 5.3...
}
<code>@Model
final class Item {
var value: Int
init(value: Int) {
self.value = value
}
}
</code>
<code>@Model
final class Item {
var value: Int
init(value: Int) {
self.value = value
}
}
</code>
@Model
final class Item {
var value: Int
init(value: Int) {
self.value = value
}
}
<code>struct NoPersistedValueType {
let value: Int
}
</code>
<code>struct NoPersistedValueType {
let value: Int
}
</code>
struct NoPersistedValueType {
let value: Int
}
<code>class NoPersistedReferenceType {
let value: Int
init(value: Int) {
self.value = value
}
}
</code>
<code>class NoPersistedReferenceType {
let value: Int
init(value: Int) {
self.value = value
}
}
</code>
class NoPersistedReferenceType {
let value: Int
init(value: Int) {
self.value = value
}
}
Real project:
<code>@Model
final public class Item {
@Relationship(deleteRule:.cascade) var entries: [Entry] = []
@Transient
var sortedEntries: [Entry] {
entries
.filter{!$0.escaped}
.sorted(by: {$0.date<$1.date})
}
//...
}
</code>
<code>@Model
final public class Item {
@Relationship(deleteRule:.cascade) var entries: [Entry] = []
@Transient
var sortedEntries: [Entry] {
entries
.filter{!$0.escaped}
.sorted(by: {$0.date<$1.date})
}
//...
}
</code>
@Model
final public class Item {
@Relationship(deleteRule:.cascade) var entries: [Entry] = []
@Transient
var sortedEntries: [Entry] {
entries
.filter{!$0.escaped}
.sorted(by: {$0.date<$1.date})
}
//...
}