我注意到一个有趣的行为。我一直在测试构建包含许多元素的链表的性能。出于某种原因,经过一定数量的解除分配后,测试就崩溃了。
这是我的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
个调用塔:
另一件有趣的事情是,如果你将列表移到测试函数之外,它就不会再崩溃了:
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)
}
}