@Jonathon Reinhart,
benchmark của bạn là tiếc không thuyết phục. Nó không tính đến tác động của việc tải xuống, lưu vào bộ nhớ đệm và/hoặc tìm nạp trước (bởi CPU, hệ điều hành máy chủ và/hoặc thời gian chạy .NET).
Trộn thứ tự các phép thử (hoặc gọi phương thức thử nhiều lần) và bạn có thể nhận thấy các phép đo thời gian khác nhau.
Tôi đã làm điểm chuẩn ban đầu của bạn được xây dựng với mục tiêu nền tảng "Bất kỳ CPU" và cấu hình máy khách .NET 4.0, chạy trên máy tính của tôi với CPU i7-3770 và Windows 7 64 bit.
gì tôi đã nhận được điều này:
Testing with 10000000 operations:
A UInt32 bitfield took 484 ms.
A BitArray (32) took 459 ms.
A List<bool>(32) took 393 ms.
đó là khá nhiều phù hợp với quan sát của bạn.
Tuy nhiên, thực hiện các bài kiểm tra BitArray trước khi thử nghiệm UInt32 mang lại điều này:
Testing with 10000000 operations:
A BitArray (32) took 513 ms.
A UInt32 bitfield took 456 ms.
A List<bool>(32) took 417 ms.
Bằng cách nhìn vào những thời điểm cho UInt32 và BitArray bài kiểm tra bạn sẽ nhận thấy rằng thời gian đo dường như không được kết nối với tự kiểm tra, nhưng đúng hơn là thứ tự các bài kiểm tra được chạy.
Để giảm bớt những tác dụng phụ này ít nhất một chút, tôi đã thực hiện các phương pháp thử nghiệm hai lần trong mỗi chương trình chạy với các kết quả sau.
Kiểm tra trật tự UInt32, BitArray, BoolArray, UInt32, BitArray, BoolArray:
Testing with 10000000 operations:
A UInt32 bitfield took 476 ms.
A BitArray (32) took 448 ms.
A List<bool>(32) took 367 ms.
A UInt32 bitfield took 419 ms. <<-- Watch this.
A BitArray (32) took 444 ms. <<-- Watch this.
A List<bool>(32) took 388 ms.
để thử nghiệm BitArray, UInt32, BoolArray, BitArray, UInt32, BoolArray:
Testing with 10000000 operations:
A BitArray (32) took 514 ms.
A UInt32 bitfield took 413 ms.
A List<bool>(32) took 379 ms.
A BitArray (32) took 444 ms. <<-- Watch this.
A UInt32 bitfield took 413 ms. <<-- Watch this.
A List<bool>(32) took 381 ms.
Nhìn vào lời gọi thứ hai của các phương pháp thử nghiệm, có vẻ như ít nhất trên các CPU i7 với thời gian chạy .NET cập nhật, kiểm tra UI132 nhanh hơn thử nghiệm BitArray, trong khi thử nghiệm BoolArray vẫn là nhanh nhất.
(Tôi xin lỗi mà tôi đã phải viết câu trả lời của tôi để chuẩn Jonathon như một câu trả lời, nhưng như một SO người dùng mới tôi không cho phép bình luận ...)
EDIT:
Thay vì xáo trộn thứ tự của phương pháp thử, bạn có thể thử đặt một Thread.Sleep (5000) hoặc tương tự ngay trước khi gọi thử nghiệm đầu tiên ...
Ngoài ra thử nghiệm ban đầu dường như đặt thử nghiệm UInt32 ở bất lợi, bởi vì nó bao gồm một ranh giới kiểm tra "nếu (bitnum < 0 || bitnum> 31)", whic h được thực hiện 30 triệu lần. Không có hai thử nghiệm nào khác bao gồm kiểm tra ranh giới như vậy. Tuy nhiên, đây thực sự không phải là toàn bộ sự thật, vì cả hai mảng BitArray và bool đều thực hiện kiểm tra ranh giới nội bộ.
Mặc dù tôi không kiểm tra, tôi hy vọng rằng việc loại bỏ kiểm tra biên sẽ làm cho các thử nghiệm UInt32 và BoolArray hoạt động tương tự, nhưng đó không phải là một đề xuất tốt cho API công khai.
Sử dụng 'System.Diagnostics.Stopwatch' bạn có thể thời gian nếu nó nhanh hơn. Tốt nhất là nên thử nó ở gần môi trường sản xuất nhất có thể. –