Span<T>
Mời một sự thay thế cực kỳ cạnh tranh mà không cần phải vứt lộn xộn và / hoặc khuẩn không di động vào cơ sở mã ứng dụng của riêng bạn:
// byte[] is implicitly convertible to ReadOnlySpan<byte>
static bool ByteArrayCompare(ReadOnlySpan<byte> a1, ReadOnlySpan<byte> a2)
{
return a1.SequenceEqual(a2);
}
Việc triển khai (can đảm của) kể từ .NET Core 3.1.0 có thể được tìm thấy ở đây .
Tôi đã sửa đổi ý chính của @ EliArbel để thêm phương thức này SpansEqual
, bỏ hầu hết các trình diễn ít thú vị hơn trong các điểm chuẩn của người khác, chạy nó với các kích thước mảng khác nhau, biểu đồ đầu ra và đánh dấu SpansEqual
làm đường cơ sở để báo cáo cách các phương thức khác nhau so sánh với SpansEqual
.
Các số dưới đây là từ các kết quả, được chỉnh sửa nhẹ để xóa cột "Lỗi".
| Method | ByteCount | Mean | StdDev | Ratio |
|-------------- |----------- |-------------------:|------------------:|------:|
| SpansEqual | 15 | 3.562 ns | 0.0035 ns | 1.00 |
| LongPointers | 15 | 4.611 ns | 0.0028 ns | 1.29 |
| Unrolled | 15 | 18.035 ns | 0.0195 ns | 5.06 |
| PInvokeMemcmp | 15 | 11.210 ns | 0.0353 ns | 3.15 |
| | | | | |
| SpansEqual | 1026 | 20.048 ns | 0.0286 ns | 1.00 |
| LongPointers | 1026 | 63.347 ns | 0.1062 ns | 3.16 |
| Unrolled | 1026 | 39.175 ns | 0.0304 ns | 1.95 |
| PInvokeMemcmp | 1026 | 40.830 ns | 0.0350 ns | 2.04 |
| | | | | |
| SpansEqual | 1048585 | 44,070.526 ns | 35.3348 ns | 1.00 |
| LongPointers | 1048585 | 59,973.407 ns | 80.4145 ns | 1.36 |
| Unrolled | 1048585 | 55,032.945 ns | 24.4745 ns | 1.25 |
| PInvokeMemcmp | 1048585 | 55,593.719 ns | 22.4301 ns | 1.26 |
| | | | | |
| SpansEqual | 2147483591 | 253,648,180.000 ns | 1,112,524.3074 ns | 1.00 |
| LongPointers | 2147483591 | 249,412,064.286 ns | 1,079,409.5670 ns | 0.98 |
| Unrolled | 2147483591 | 246,329,091.667 ns | 852,021.7992 ns | 0.97 |
| PInvokeMemcmp | 2147483591 | 247,795,940.000 ns | 3,390,676.3644 ns | 0.98 |
Tôi đã rất ngạc nhiên khi thấy rằng SpansEqual
không đi đầu trong các phương pháp kích thước mảng tối đa, nhưng sự khác biệt là rất nhỏ đến nỗi tôi không nghĩ nó sẽ trở nên quan trọng.
Thông tin hệ thống của tôi:
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362
Intel Core i7-6850K CPU 3.60GHz (Skylake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=3.1.100
[Host] : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT
DefaultJob : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT