Calling removeLast
ist extrem langsam (es dauert einige Minuten, um 77k Elemente abzufischen). Die documentation sagt O (1) und ich würde denken, dass die Implementierung einfach die Array-Größe dekrementieren würde. Offenbar nicht:swift array removeLast extrem langsam
Warum ruft remove(at: Int)
?
Dieser repro Fall ist langsamer als ich erwarten würde (ich verwende, um C++ 's std::vector
Leistung), aber immer noch nicht so langsam wie das, was ich in meinem Code bin zu sehen:
var array = [ Int ]()
for i in 0..<262144 {
array.append(i)
}
print ("done appending") // we get here immediately
let n = array.count
for _ in 0..<n {
array.removeLast() // popLast is also slow
}
print ("done")
Dieser Vorgang dauert 16 Sekunden auf meiner Maschine. Ein äquivalentes C++ - Programm dauert 0,002 Sekunden.
Können Sie nach Code, wie Sie diese getestet? – Fogmeister
Arrays sind Werttypen, die beim Schreiben kopiert werden. Es macht also Sinn, dass es eine neue Kopie auf 'removeLast' erstellt. Man sollte jedoch denken, dass dies auch schnell sein sollte. –
@Fogmeister Ich versuche, Code für eine Repro zu ziehen, ohne nur meinen gesamten Code zu verlieren. Wenn ich einen ähnlichen Testfall schreibe, ist es schnell. Etwas Feines passiert. – Taylor