2017-03-20 4 views
0

私は面白い動作に気付いています。私は多くの要素を持つリンクされたリストを構築するパフォーマンスをテストしてきました。何らかの理由で、一定量の割り当てを解除した後、クラッシュによるテスト。104634個のノードを持つリンクリストを作成すると、テストがクラッシュする

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ライブラリを使用して、これをテストしてい:

は、ここに私のLinkedListの実装です。私はこのテスト機能を作った:

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

私はかなりの時間をかけてこの数字を調べた。それは私がノードとの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) 
    } 
    } 
} 

私は好奇心へと割り当て解除の長いシリーズは、クラッシュを引き起こすことができる理由。前もって感謝します!

EDIT:あなたは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) 
    } 
} 

答えて

0

テストをコンパイルできませんでした。 enter image description here

このコードは、100倍のノードで動作しました。私は自己参照があなたの問題だとは思わないが、あなたが古いSwiftバージョンを使用していることを示している。ツールをアップグレードして、もう一度お試しください。 enter image description here

+0

ありがとう、これは興味深いです。私はあなたのように 'print'ステートメントを追加し、ブレークポイントを追加しました。ブレークポイントは正常にトリガーされました。テスト終了後にクラッシュが発生したようです。 あなたの番号を '1046340'に微調整してテストを実行するのが速いので、ブレークポイントを削除してください。 ツールについては、最新のものを使用していると思います。私はXcodeバージョン8.2.1(8C1002)を使用しています。あなたが '自己参照 'によって何を意味するか分からない。 –

+0

あなたはデニットと何かをしていると思います。私は、XCTestCaseが成功/失敗を決定するためのメソッドの最後に何か夢中になっているかどうかと、膨大な量の割り当て解除が何かを混乱させているのだろうかと思います。リストのデータプロパティを弱くすると(機能が破損しますが...)、問題が発生しないことがわかります。また、割り当て解除は、ループの最中にすべてではなくループ内で実行されます関数スコープ。 –

+0

@AndrewCarterこれは 'XCTestCase'だけではなく、View Controllerの' viewDidLoad'メソッドでこれを試みました。私はアプリを走らせて、アプリをクラッシュさせた。 –

関連する問題