gpt4 book ai didi

swift - 追踪 Swift 中过多的保留/释放

转载 作者:行者123 更新时间:2023-11-30 11:20:21 24 4
gpt4 key购买 nike

我正在 Swift 中移植路径跟踪器(为了好玩)。它使用简单的八叉树加速结构,作为 SpatialIndex 类实现,并为子节点提供 [SpatialIndex?] 属性。我编写了一种通过查找距某个任意点最近的点来测试加速结构的方法。第一种方法是递归的,效果很好。然后,我尝试实现一种基于循环的方法,该方法也可以正常工作,但速度慢了 3 倍,并且大部分时间都花在保留/释放调用上。

问题是,我真的不明白为什么它比递归方法需要更多的保留/释放调用,而且我不知道如何跟踪实际被 ARC 处理的内容。在这种情况下,引用计数占据了大约一半的时间。至少可以说,这似乎有点过分。

当我搜索 ARC 问题时,我主要找到与保留循环等相关的内容。我真正希望能够做的是有效地绕过整个系统,因为我知道树的内存布局无法更改。

所以我的问题基本上是:当 ARC 导致性能问题时,跟踪它实际花费时间引用计数的最佳选项是什么,以及如何加快速度?

最佳答案

您可以使用Unmanaged type绕过特定对象的 ARC。我还没有尝试过这么多,但我想它看起来像这样:

  1. 在性能关键部分之前,将要跳过 ARC 的对象包装在 Unmanaged 值中:

    let unmanagedObj = Unmanaged.passRetained(obj)
  2. 在临界区内,传递Unmanaged 值不会带来引用计数开销。当需要使用该对象时,像这样提取它:

    let obj = unmanagedObj.takeUnretainedValue()
  3. 在临界区之后,释放对象:

    unmanagedObj.release()

当然,只有当您控制需要将对象传递到的函数时,这才有效,因为您必须将它们从获取对象更改为获取非托管值。不知道你是否也是这样。

也许您可以通过将对象图的不同部分切换为非托管来找出代码中哪些类型的对象导致最多的引用计数开销。

关于swift - 追踪 Swift 中过多的保留/释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com