Swift数组代码:
let numcolors = colorCount(filter: filter,colorInfoCount: colorInfo.count)var colorCountsArray: [Int] = [Int]()var countTocolorMap: [Int:[Countedcolor]] = [Int:[Countedcolor]](minimumCapacity: capacity)var topcolors = [Countedcolor]()var startTime = CACurrentMediaTime()for (color,colorCount) in colorInfo { colorCountsArray.append(colorCount) if countTocolorMap[colorCount] != nil { countTocolorMap[colorCount]?.append(Countedcolor(color: color,colorCount: colorCount)) } else { countTocolorMap[colorCount] = [Countedcolor(color: color,colorCount: colorCount)] }}var endTime = CACurrentMediaTime()print("Time after mapPing: \(endTime - startTime)")
迅捷表现:
Time after mapPing: 45.0881789259997
NSMutableArray代码:
let numcolors = colorCount(filter: filter,colorInfoCount: colorInfo.count)var colorCountsArray: [Int] = [Int]()var countTocolorMap: [Int:NSMutableArray] = [Int:NSMutableArray](minimumCapacity: capacity)var topcolors = [Countedcolor]()var startTime = CACurrentMediaTime()for (color,colorCount) in colorInfo { colorCountsArray.append(colorCount) if countTocolorMap[colorCount] != nil { countTocolorMap[colorCount]?.add(Countedcolor(color: color,colorCount: colorCount)) } else { countTocolorMap[colorCount] = NSMutableArray(object: Countedcolor(color: color,colorCount: colorCount)) }}var endTime = CACurrentMediaTime()print("Time after mapPing: \(endTime - startTime)")
NSMutableArray表现:
Time after mapPing: 0.367132211999888
colorInfo对象是将UIcolor对象映射到表示计数的Integer值的字典.代码本质上反向映射,将整数映射到UIcolor数组(它是一个数组,因为多个颜色可以具有相同的计数). colorInfo里面有60,000个UIcolor,Int键值对.
写入时复制是一件棘手的事情,您需要仔细考虑共享一个您正在尝试修改的结构的内容.罪魁祸首就在这里.countTocolorMap[colorCount]?.append(Countedcolor(color: color as! UIcolor,colorCount: colorCount))
这将生成一个临时值,该值将被修改并重新放入字典中.由于两个“事物”正在查看相同的底层数据结构(字典和附加),因此它会强制执行写入时复制.
解决这个问题的秘诀是确保修改它时只有一个副本.怎么样?把它拿出字典.替换这个:
if countTocolorMap[colorCount] != nil { countTocolorMap[colorCount]?.append(Countedcolor(color: color as! UIcolor,colorCount: colorCount))} else { countTocolorMap[colorCount] = [Countedcolor(color: color as! UIcolor,colorCount: colorCount)]}
它的运行时间为:
Elapsed Time: 74.251746599002253217
有了这个:
var countForcolor = countTocolorMap.removeValue(forKey: colorCount) ?? []countForcolor.append(Countedcolor(color: color as! UIcolor,colorCount: colorCount))countTocolorMap[colorCount] = countForcolor
它的运行时间为:
Elapsed Time: 0.37095380800019553217总结
以上是内存溢出为你收集整理的数组 – Swift中的字典与Mutable Array作为值表现得非常慢?如何优化或构建正确?全部内容,希望文章能够帮你解决数组 – Swift中的字典与Mutable Array作为值表现得非常慢?如何优化或构建正确?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)