使用104634个节点

时间:2017-03-20 18:12:04

标签: ios swift data-structures

我注意到一个有趣的行为。我一直在测试构建包含许多元素的链表的性能。出于某种原因,经过一定数量的解除分配后,测试就崩溃了。

这是我的LinkedList实现:

class LinkedList<T> {
  let data: T
  var next: LinkedList?

  init(data: T, next: LinkedList? = nil) {
    self.data = data
    self.next = next
  }

  func cons(_ data: T) -> LinkedList {
    return LinkedList(data: data, next: self)
  }
}

我正在使用XCTest库对此进行测试。我做了这个测试功能:

let number = 104633
func testPerformanceExample() {
  self.measure {
    var list = LinkedList<Int>(data: 5)
    for i in 0..<number {
      list = list.cons(i)
    }
  }
}

我花了相当多的时间试图回到这个数字。似乎如果我尝试使用 104634 节点构建LinkedList,我会遇到Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5a059ff8)崩溃,并且调试导航器会显示LinkedList.deinit个调用塔:

debug screenshot

另一件有趣的事情是,如果你将列表移到测试函数之外,它就不会再崩溃了:

var list = LinkedList<Int>(data: 5)

func testPerformanceExample() {
  self.measure {
    for i in 0..<self.number {
      self.list = self.list.cons(i)
    }
  }
}

我很好奇为什么长时间的一系列解除分配会导致崩溃。提前谢谢!

编辑

当您在XCTestCase之外运行代码时,也会发生此崩溃。我在UIViewController

中获得了此代码
class ViewController: UIViewController {
  let number = 1046340
  override func viewDidLoad() {
    super.viewDidLoad()

    let date = Date()
    var list = LinkedList<Int>(data: 0, next: nil)
    for i in 0..<number {
      list = list.cons(i)
    }
    let timeInterval = Date().timeIntervalSince(date)

    print(timeInterval)
  }
}

1 个答案:

答案 0 :(得分:0)

我无法编译你的测试。 enter image description here

此代码使用100x的节点。我不认为自引用是你的问题,但它确实表明你使用的是较旧的Swift版本。升级您的工具,然后重试。 enter image description here