https://github.com/bartimaeusnek/just-crc32c
Just a simple and fast CRC32C Wrapper with hardware acceleration.
https://github.com/bartimaeusnek/just-crc32c
crc32c csharp dotnet6 hardware-acceleration
Last synced: 4 months ago
JSON representation
Just a simple and fast CRC32C Wrapper with hardware acceleration.
- Host: GitHub
- URL: https://github.com/bartimaeusnek/just-crc32c
- Owner: bartimaeusnek
- License: lgpl-3.0
- Created: 2023-01-06T04:49:56.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-07-29T10:15:47.000Z (about 2 years ago)
- Last Synced: 2025-05-16T23:13:28.919Z (5 months ago)
- Topics: crc32c, csharp, dotnet6, hardware-acceleration
- Language: C#
- Homepage:
- Size: 90.8 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Just-CRC32C
[](https://opensource.org/licenses/LGPL-3.0) [](https://www.nuget.org/packages/JustCRC32C/)Just a simple and fast CRC32C Wrapper with hardware acceleration.
The library overall is licensed under LGPLv3, so you can use it in a propriatary project, as long as you do not change the library itsef!
Software-fallback is taken from: [here](https://github.com/force-net/Crc32.NET/blob/26c5a818a5c7a3d6a622c92d3cd08dba586c263c/Crc32.NET/SafeProxy.cs#L38)
and Licensed under [MIT License](https://github.com/force-net/Crc32.NET/blob/26c5a818a5c7a3d6a622c92d3cd08dba586c263c/LICENSE) and improved by a tiny bit.The netstandard2.0 variation for .netFramework uses p/invoke for the ANSI-C compatible JustCRC32C.Native library to archive hardware acceleration.
Benchmark results:
``` iniBenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.3086/22H2/2022Update)
AMD Ryzen 5 5600X, 1 CPU, 12 logical and 6 physical cores
.NET SDK=8.0.100-preview.1.23115.2
[Host] : .NET 6.0.18 (6.0.1823.26907), X64 RyuJIT AVX2
Job-LBWJTK : .NET 8.0.0 (8.0.23.11008), X64 RyuJIT AVX2Runtime=.NET 8.0 RunStrategy=Throughput
```
| Method | Arrays | Mean | Error | StdDev | Median | Ratio | RatioSD |
|----------------------- |--------------------- |-----------------:|--------------:|--------------:|-----------------:|------:|--------:|
| **JustCrc32C_HardwareX64** | **big a(...)ytes) [41]** | **318,356.546 μs** | **959.0297 μs** | **748.7473 μs** | **318,351.500 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | big a(...)ytes) [41] | 614,984.617 μs | 1,256.5669 μs | 981.0448 μs | 614,961.000 μs | 1.93 | 0.01 |
| JustCrc32C_Software | big a(...)ytes) [41] | 1,203,940.725 μs | 8,988.4146 μs | 7,017.5629 μs | 1,201,179.900 μs | 3.78 | 0.03 |
| Crc32_dot_NET | big a(...)ytes) [41] | 1,404,042.087 μs | 8,606.4555 μs | 8,050.4838 μs | 1,403,310.000 μs | 4.41 | 0.03 |
| | | | | | | | |
| **JustCrc32C_HardwareX64** | **mediu(...)ytes) [44]** | **25,509.060 μs** | **308.8947 μs** | **288.9403 μs** | **25,313.297 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | mediu(...)ytes) [44] | 48,946.426 μs | 47.9768 μs | 40.0628 μs | 48,952.936 μs | 1.92 | 0.02 |
| JustCrc32C_Software | mediu(...)ytes) [44] | 96,605.061 μs | 1,044.4672 μs | 925.8930 μs | 96,954.150 μs | 3.79 | 0.05 |
| Crc32_dot_NET | mediu(...)ytes) [44] | 112,126.815 μs | 1,285.5934 μs | 1,202.5449 μs | 111,274.080 μs | 4.40 | 0.07 |
| | | | | | | | |
| **JustCrc32C_HardwareX64** | **small(...)ytes) [37]** | **243.729 μs** | **0.2736 μs** | **0.2285 μs** | **243.614 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | small(...)ytes) [37] | 486.916 μs | 0.5105 μs | 0.4263 μs | 486.761 μs | 2.00 | 0.00 |
| JustCrc32C_Software | small(...)ytes) [37] | 961.411 μs | 4.4316 μs | 4.1454 μs | 961.110 μs | 3.94 | 0.02 |
| Crc32_dot_NET | small(...)ytes) [37] | 1,121.784 μs | 10.2630 μs | 9.6001 μs | 1,121.731 μs | 4.60 | 0.04 |
| | | | | | | | |
| **JustCrc32C_HardwareX64** | **small(...)ytes) [49]** | **2,519.386 μs** | **28.7737 μs** | **26.9149 μs** | **2,502.841 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | small(...)ytes) [49] | 4,980.498 μs | 89.1571 μs | 83.3976 μs | 4,947.656 μs | 1.98 | 0.05 |
| JustCrc32C_Software | small(...)ytes) [49] | 9,880.705 μs | 194.7273 μs | 182.1480 μs | 9,932.087 μs | 3.92 | 0.09 |
| Crc32_dot_NET | small(...)ytes) [49] | 11,428.893 μs | 227.2975 μs | 287.4585 μs | 11,432.837 μs | 4.53 | 0.13 |
| | | | | | | | |
| **JustCrc32C_HardwareX64** | **small(...)ytes) [38]** | **24.642 μs** | **0.4474 μs** | **0.4185 μs** | **24.575 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | small(...)ytes) [38] | 49.555 μs | 0.9786 μs | 1.1269 μs | 49.009 μs | 2.02 | 0.06 |
| JustCrc32C_Software | small(...)ytes) [38] | 99.483 μs | 1.9473 μs | 2.9147 μs | 100.555 μs | 4.07 | 0.14 |
| Crc32_dot_NET | small(...)ytes) [38] | 113.458 μs | 2.2429 μs | 3.4919 μs | 111.205 μs | 4.64 | 0.16 |
| | | | | | | | |
| **JustCrc32C_HardwareX64** | **tiny (...)ytes) [27]** | **1.903 μs** | **0.0293 μs** | **0.0274 μs** | **1.911 μs** | **1.00** | **0.00** |
| JustCrc32C_Hardware | tiny (...)ytes) [27] | 3.530 μs | 0.0283 μs | 0.0265 μs | 3.518 μs | 1.86 | 0.04 |
| JustCrc32C_Software | tiny (...)ytes) [27] | 11.966 μs | 0.2357 μs | 0.2205 μs | 11.943 μs | 6.29 | 0.14 |
| Crc32_dot_NET | tiny (...)ytes) [27] | 13.929 μs | 0.1878 μs | 0.1757 μs | 13.931 μs | 7.32 | 0.13 |