1

我想解析一个 EPUB 文件,将文件读入内存后,我需要解析内容。这本书可能有10多个章节;我为每一章创建了 NSOperation 实例,并运行并发,全部基于 CPU 计算。

我应该有 2 个线程,每个线程有 5 个要处理的章节,还是每个线程有 10 个线程?哪个更有效率?不同的设备会有不同的策略?

4

1 回答 1

4

我应该有 2 个线程,每个线程有 5 个要处理的章节,还是每个线程有 10 个线程?哪个更有效率?

您应该做的是创建一个可能有 2 或 3 个线程的工作池、一个队列,并让每个线程一次从队列中拉出一个任务并执行它。工作线程的数量应与设备上的内核数量成正比。(实际的最佳数量将取决于处理任务是否需要进行可能导致线程阻塞一段时间的 I/O ...)

为每一章创建一个线程会消耗资源(线程堆栈)而不会加速。只有当你有足够的物理内核,线程实际上可以在不同的内核上并行执行时,你才能获得加速。

将章节预分配给线程并不是一个好主意,因为您可能会为一个线程分配比另一个线程少得多的工作负载。


实际上,如果可以廉价地估算出处理每一章的工作量,那么在跨线程调度工作负载方面可能会比简单的队列做得更好。但是否值得付出努力是值得商榷的。

于 2012-07-08T03:47:14.390 回答