Đối với những người chăm sóc hiệu suất ..Có một vài cách khác làm thế nào để lặp qua các đống thành viên ban đầu mà không tổn thất lớn trong việc thực hiện:
public T[] Stack<T>.ToArray();
public void Stack<T>.CopyTo(T[] array, int arrayIndex);
Tôi đã viết một chương trình thô (liên kết sẽ được cung cấp vào cuối bài viết) để đo hiệu suất và bổ sung thêm hai thử nghiệm cho việc triển khai đã đề nghị (xem Clone1 và Clone2), và hai bài kiểm tra cho ToArray và CopyTo cách tiếp cận (xem Clone3 và Clone4, cả trong số họ sử dụng hiệu quả hơn Array.Reverse phương pháp).
public static class StackExtensions
{
public static Stack<T> Clone1<T>(this Stack<T> original)
{
return new Stack<T>(new Stack<T>(original));
}
public static Stack<T> Clone2<T>(this Stack<T> original)
{
return new Stack<T>(original.Reverse());
}
public static Stack<T> Clone3<T>(this Stack<T> original)
{
var arr = original.ToArray();
Array.Reverse(arr);
return new Stack<T>(arr);
}
public static Stack<T> Clone4<T>(this Stack<T> original)
{
var arr = new T[original.Count];
original.CopyTo(arr, 0);
Array.Reverse(arr);
return new Stack<T>(arr);
}
}
Kết quả là:
- Clone1: 318,3766 ms
- Clone2: 269,2407 ms
- Clone3: 50,6025 ms
- Clone4: 37,5233 ms - người chiến thắng
Như chúng tôi có thể thấy, cách tiếp cận sử dụng phương pháp CopyTo nhanh hơn 8 lần và đồng thời việc triển khai khá đơn giản và dễ hiểu. Hơn nữa, tôi đã làm một nghiên cứu nhanh chóng trên một giá trị tối đa của stack kích thước: Clone3 và Clone4 xét nghiệm làm việc cho các kích cỡ chồng lớn hơn trước OutOfMemoryException xảy ra:
- Clone1: 67.108.765 yếu tố
- Clone2: 67.108.765 yếu tố
- Clone3: 134.218.140 yếu tố
- Clone4: 134.218.140 yếu tố
Kết quả trên cho Clone1 và Clone2 nhỏ do các bộ sưu tập bổ sung mà là rõ ràng/ngầm được xác định và do đó ảnh hưởng tiêu thụ bộ nhớ. Do đó, Clone3 và Clone4 phương pháp tiếp cận cho phép sao chép một thể hiện ngăn xếp nhanh hơn và với ít phân bổ bộ nhớ hơn. Bạn có thể đạt được kết quả tốt hơn bằng cách sử dụng Reflection, nhưng đó là một câu chuyện khác nhau :)
Danh sách đầy đủ chương trình có thể được tìm thấy here.
thật đáng buồn, kỳ quặc, không giữ gìn trật tự :((Tôi cho rằng khởi tạo gấp đôi ngăn xếp là lỗi chính tả hoặc là một mẹo?) – SpaceBear
@Angrius: Nó giữ nguyên thứ tự. – jason
@Angrius: "Khởi tạo kép" là bắt buộc bởi vì mỗi lần đảo ngược thứ tự.Nếu bạn đảo ngược nó hai lần bạn nhận được thứ tự ban đầu – Gabe