2017-01-23 22 views
5

Gọi removeLast cực kỳ chậm (phải mất vài phút để tắt 77k phần tử). Các documentation nói O (1) và tôi sẽ nghĩ rằng việc thực hiện sẽ chỉ đơn giản là giảm kích thước mảng. Rõ ràng không:mảng nhanh chóng xóaLoại cực kỳ chậm

stack trace indicating <code>removeLast</code> calling memmove

Tại sao nó gọi remove(at: Int)?

trường hợp repro Đây là chậm hơn so với tôi mong chờ (Tôi đã quen với C++ 's std::vector hiệu suất), nhưng vẫn không chậm như những gì tôi nhìn thấy trong mã của tôi:

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") 

này có 16 giây trên máy tính của tôi. Một chương trình C++ tương đương mất 0,002 giây.

+2

Bạn có thể gửi mã về cách bạn thử nghiệm này? – Fogmeister

+0

Mảng là loại giá trị sao chép trên ghi. Vì vậy, nó làm cho tinh thần rằng nó làm cho một bản sao mới trên 'removeLast'. Tuy nhiên người ta sẽ nghĩ rằng điều này cũng nên nhanh. –

+0

@ Fogmeister Tôi đang cố gắng rút ra một số mã cho một repro mà không cần phải bán tất cả các mã của tôi. Khi tôi viết một trường hợp thử nghiệm tương tự, nó nhanh. Một cái gì đó tinh tế đang xảy ra. – Taylor

Trả lời

4

Vấn đề là cách bạn đang thử nghiệm. Không kiểm tra tốc độ trong bản dựng Gỡ lỗi có ý nghĩa một chút. Đây là lý do tại sao bạn nên luôn luôn tiểu sử trong Công cụ. Nó sử dụng bản dựng. Để có kết quả thực tế, hồ sơ trong Công cụ trên thiết bị. Mọi thứ khác là ảo ảnh.

Vì vậy, hãy tạo Bản phát hành chứ không phải bản dựng Gỡ lỗi. Bạn sẽ thấy rằng trong thực tế bạn nhận được cả hai tuyên bố printngay lập tức.

Kết quả (trên máy tính của tôi, không phải là một thiết bị, bởi vì tôi đã quá lười biếng để lấy điện thoại ra khỏi túi của tôi) hiển thị giây kể từ ngày tham khảo:

starting 506917910.056674 
done appending 506917910.060245 
done 506917910.069827 
+0

Có thể xác nhận: 'swift -O test.swift' hoàn thành ngay lập tức – Alexander

+0

Silly me. Tôi đang sử dụng để xây dựng gỡ lỗi có thể sử dụng! – Taylor

+0

Điều tương tự cũng đúng với quản lý bộ nhớ. Quản lý bộ nhớ Swift trong một bản dựng Debug trong Simulator là một lời nói dối lớn. – matt

Các vấn đề liên quan