利用set提高遍歷性能
let members: [Member]
let platinumMemberIDs:[Int]
優(yōu)化前
時(shí)間復(fù)雜度是O(n2)
var platinumMembers = members.filter {
platinumMemberIDs.contains($0.id)
}
優(yōu)化后
時(shí)間復(fù)雜度是O(n)
let platinumMemberIDSet = Set(platinumMemberIDs)
var platinumMembers = members.filter {
platinumMemberIDSet.contains($0.id)
}
利用字典提高遍歷性能
let starUsers: [User]
let recentUsers: [User]
優(yōu)化前
時(shí)間復(fù)雜度是O(n2)
ar duplicatedUsers = [User]()
for star in starUsers {
for recent in recentUsers {
if star.email == recent.email {
duplicatedUsers.append(star)
}
}
}
優(yōu)化后
時(shí)間復(fù)雜度是O(n)
let recentUserMap = Dictionary(uniqueKeysWithValues: recentUsers.map { ($0.email, $0) })
let duplicatedUsers = starUsers.filter {
guard let _ = recentUserMap[$0.email] else { return false }
return true
}
如何通過(guò)減少集合類(lèi)型初始化來(lái)提高iOS代碼性能?
使用 reduce(::) 和 reduce(into:_:) 來(lái)演示執(zhí)行速度的差異。這兩個(gè)示例都旨在創(chuàng)建一個(gè)以用戶(hù)名為鍵,以用戶(hù)ID為值的字典
Example 1
let userDict = users.reduce([String: Int]()) { (dict, user) -> [String: Int] in
var dict = dict
dict[user.name] = user.id
return dict
}
Example 2
let userDict2 = users.reduce(into: [:]) { dict, user in
dict[user.name] = user.id
}
示例1的執(zhí)行時(shí)間為0.07398414611816406秒,而示例2的執(zhí)行時(shí)間為0.0013837814331054688秒。它比示例1快50多倍