Arrays 在大型数组(1000)中查找firstIndex的最快方法Swift

Arrays 在大型数组(1000)中查找firstIndex的最快方法Swift,arrays,swift,indexing,filter,instruments,Arrays,Swift,Indexing,Filter,Instruments,有没有更快的方法在自定义对象数组中查找索引 我有一个数组,它的计数大约为1000。在每个SectionIndex中有一个包含我所有属性的MainIndex,每个SectionIndex大约有15个MainIndex部分。SectionIndex用于TableView节标题,.data[MainIndex]部分填充每个节中的行 在运行启动我的应用程序(array.firstIndex)所需的5秒仪器(时间分析)后,(array.firstIndex)行已花费3.89秒,我是否可以加快找到索引的部分

有没有更快的方法在自定义对象数组中查找索引

我有一个数组,它的计数大约为1000。在每个SectionIndex中有一个包含我所有属性的MainIndex,每个SectionIndex大约有15个MainIndex部分。SectionIndex用于TableView节标题,.data[MainIndex]部分填充每个节中的行

在运行启动我的应用程序(array.firstIndex)所需的5秒仪器(时间分析)后,(array.firstIndex)行已花费3.89秒,我是否可以加快找到索引的部分的速度

var array: [SectionIndex] = [SectionIndex]()
功能的主要部分:

let title = "\(dateMonth), \(dateYear)"
if let offset = array.firstIndex(where: { $0.title == title })
{
     array[offset].data.append(insert)
     if let mins = array[offset].minutes {
     array[offset].minutes = mins + timeToMinutes(minutes)
     }
}
else
{
     let insert2 = SectionIndex(index: array.count, title: title, date: date, data: [insert], minutes: timeToMinutes(minutes))
     array.append(insert2)
}
截面索引

class SectionIndex {
let index: Int?
let title: String?
let date: Date?
var data: [MainIndex] = [MainIndex]()
var minutes: Int?
init(index: Int, title: String, date: Date, data: [MainIndex], minutes: Int)
{
    self.index = index
    self.title = title
    self.date = date
    self.data = data
    self.minutes = minutes
}
}
我需要查找或添加索引的原因:

我的数据来自一年中的不同月份,可以追溯到大约1000个月前,每当首先找到月份和年份时,它就会成为一个标题,下次当它已经存在时,我会将数据附加到该部分


Xcode 12.2(Swift 5)

根据评论建议和Rob的字典建议,我修改了以下内容,解决了我的问题,大大提高了性能

 var currentIndex: Int = 0
 var dic: [String: Int] = [:]

 // Code below runs 15,000 times for each database entry
 if let offset = dic[title]
 {
     array[offset].data.append(insert)
     if let mins = array[offset].minutes { array[offset].minutes = mins + timeToMinutes(minutes) }
 }
 else
 {
       let insert2 = SectionIndex(index: currentIndex, title: title, date: date, data: [insert], minutes: timeToMinutes(minutes))
       dic[title] = currentIndex
       currentIndex += 1
       array.append(insert2)
 }
我还去掉了我的主体部分中的选项,添加了很多条目,这进一步提高了加载性能。上述结果:

主螺纹:1.91s

起点:1.77秒

系统接口初始化:1.29s

UIKit初始化:933毫秒

启动初始帧渲染:1.64s


我对结果很满意,因为这是在1000个部分中加载15000个条目的最坏情况,但是如果有人有任何进一步的建议和改进,请告诉我。

如果某项操作需要很长时间,请不要在启动期间在主线程上执行。启动需要快速。多久调用一次此
array.firstIndex
?3.9秒似乎太长了,除非你经常这么叫。另外,您确定
SectionIndex
中的属性必须是可选的吗?从
init
可以看出,你可以去掉所有的
标记。是的,只有1000个项目需要几秒钟是不可想象的。还有别的事。(顺便问一下,我假设您正在分析发布/优化的构建,对吗?)在您的实际代码中是否存在一些嵌套循环或类似的东西。一次搜索不可能花那么长时间,但我想知道你是否在重复这样做。在回答您的问题时,加快搜索速度的方法是改进对O(1)的搜索(例如使用字典、您自己的哈希表等)。但我们感觉没有足够的时间来诊断正在发生的事情……如果需要几秒钟的时间,几乎总是最好(a)呈现一个微调器(例如a
UIActivityIndicatorView
);(b) 在后台做;和(c)移除微调器,并在完成后更新主线程上的模型和UI。它让用户知道应用程序没有被冻结,并避免了看门狗进程杀死无响应应用程序的风险。很明显,如果你能像你一样加快速度,那就太好了。但是任何超过几毫秒的事情都应该在后台线程上完成。但是我很高兴你找到了一个很好的解决方案来解决这个缓慢、阻塞的过程。