为什么在导入模块中使用函数时,Swift多线程效率低得多?

时间:2019-02-06 09:21:39

标签: swift multithreading concurrency

我将在此处省略很多“不相关”的细节,以帮助人们专注于实际问题。

我有一个Swift项目,其中涉及大量计算(数值积分和多参数最佳拟合等)。为了加快速度,我的目标是使用并发处理。

使用XCTest类,我发现在我的闭包调用模块中定义的函数的情况下,如果我使用DispatchQueue.concurrentPerform进行一次迭代,则需要花费时间t。如果重复进行5次迭代,它的运行速度会慢5%(对此我感到满意)。

该函数是结构(我的微积分例程集合)上的静态函数。

但是,如果我将函数放在单独的模块中并导入它,则以1次迭代重复测试将花费相似的时间t。但是现在,当我尝试5次迭代时,调用所需的时间是原来的两倍(实际上要慢105%)。

快速版本:4.2.1 作业系统:macOS 10.14.3 Xcode 10.1 处理器:6核Core i7(Mac mini 2018)

除函数引用外,所有“对象”都是在各处使用的结构和值类型。

再次快速总结:使用 DispatchQueue.concurrentPerform(),与相同模块定义的函数1次迭代的基线时间相比, 5次迭代是慢5%。但是,当使用在导入的模块中定义的函数执行相同的过程时,基线时间对于1次迭代保持不变,但 5次迭代要慢105%

任何人都可以解释为什么会发生这种情况,并希望提出一种避免这种速度降低的方法,同时将我的收藏集保留在可导入的模块中吗?

如果您需要更多信息,请随时提问。

1 个答案:

答案 0 :(得分:0)

问题已解决。不知道是什么原因。

删除我的项目,创建一个新项目,将文件重新导入到其中,并将其包含在工作区中。

现在5个并发线程处理的时间仅比单个线程长10%(工作量的5倍)。仍然想知道是什么原因引起的,如果效率下降的幅度仅为前面提到的情况的5%,那将是个好习惯。

但是,从刚开始一个新项目开始就获得了这种改进,所以我不会不休!