crc32
crc32 copied to clipboard
Add CMake, github action, google test and benchmark...
I made some modification for my needs, if you are interested:
Here are the main changes:
- Add github action for Linux, MacOS, Windows
- Add github action for cross platform (ARM, RISCV, PowerPC ect...) with dockcross
- Add Google test and Google benchmark, to avoid regressions with units test
- Add CMake (Shared or Static crc32 library), can be installed (Tested only on ArchLinux/Manjaro and ubuntu 21.10)
- Add optional CMake Presets (CMake 3.14 min)
- Add Examples
- Improve Readme
- Compatible C++11 to C++17
- Add C function
- CMake library based on cmake-init
- Use std::chrono and std::chrono::high_resolution_clock, instead ctime and custom second function.
- Improve warning message with MSCV
- Update readme README.md
- Update CMake build option: CRC32_USE_LOOKUP_TABLE_BYTE, CRC32_USE_LOOKUP_TABLE_SLICING_BY_4...
I kept arduino and js codes.
It is a CMake library, it can be used easily with other CMake projects (or non-cmake projects)
Google Benchmark info (Built with Clang 12):
2021-11-12T19:33:45+01:00
Running ./crc32_bench
Run on (16 X 3200 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x8)
L1 Instruction 32 KiB (x8)
L2 Unified 512 KiB (x8)
L3 Unified 16384 KiB (x1)
Load Average: 1.14, 1.61, 1.60
***WARNING*** CPU scaling is enabled, the benchmark real time measurements may be noisy and will incur extra overhead.
------------------------------------------------------------------------------------------------
Benchmark Time CPU Iterations UserCounters...
------------------------------------------------------------------------------------------------
crc32_fast/1 2.07 ns 2.07 ns 323706700 bytes_per_second=461.104M/s items_per_second=483.503M/s
crc32_fast/100 77.7 ns 77.7 ns 9020495 bytes_per_second=1.19936G/s items_per_second=12.8781M/s
crc32_fast/10000 1836 ns 1836 ns 382291 bytes_per_second=5.073G/s items_per_second=544.71k/s
crc32_fast/1000000 187754 ns 187752 ns 3710 bytes_per_second=4.96037G/s items_per_second=5.32616k/s
crc32_fast/100000000 18941422 ns 18941036 ns 37 bytes_per_second=4.91696G/s items_per_second=52.7954/s
crc32_fast/1000000000 190844392 ns 190838597 ns 4 bytes_per_second=4.88016G/s items_per_second=5.24003/s
crc32_fast_cpp/1 1.84 ns 1.84 ns 379435068 bytes_per_second=518.663M/s items_per_second=543.857M/s
crc32_fast_cpp/100 53.5 ns 53.5 ns 12907536 bytes_per_second=1.7403G/s items_per_second=18.6863M/s
crc32_fast_cpp/10000 1548 ns 1548 ns 451281 bytes_per_second=6.01749G/s items_per_second=646.123k/s
crc32_fast_cpp/1000000 153039 ns 153038 ns 4572 bytes_per_second=6.08554G/s items_per_second=6.5343k/s
crc32_fast_cpp/100000000 15386000 ns 15386010 ns 45 bytes_per_second=6.05305G/s items_per_second=64.9941/s
crc32_fast_cpp/1000000000 154053198 ns 154051600 ns 5 bytes_per_second=6.04552G/s items_per_second=6.49133/s
crc32_bitwise/1 3.20 ns 3.20 ns 218217849 bytes_per_second=297.742M/s items_per_second=312.205M/s
crc32_bitwise/100 498 ns 498 ns 1406072 bytes_per_second=191.564M/s items_per_second=2.00869M/s
crc32_bitwise/10000 50008 ns 50008 ns 13999 bytes_per_second=190.703M/s items_per_second=19.9966k/s
crc32_bitwise/1000000 5003764 ns 5003704 ns 140 bytes_per_second=190.594M/s items_per_second=199.852/s
crc32_bitwise/100000000 500298660 ns 500294354 ns 1 bytes_per_second=190.623M/s items_per_second=1.99882/s
crc32_bitwise/1000000000 5035413920 ns 5035314215 ns 1 bytes_per_second=189.397M/s items_per_second=0.198597/s
crc32_bitwise_cpp/1 3.20 ns 3.20 ns 217396770 bytes_per_second=298.059M/s items_per_second=312.538M/s
crc32_bitwise_cpp/100 498 ns 498 ns 1404838 bytes_per_second=191.418M/s items_per_second=2.00716M/s
crc32_bitwise_cpp/10000 50014 ns 50014 ns 13992 bytes_per_second=190.681M/s items_per_second=19.9943k/s
crc32_bitwise_cpp/1000000 5005841 ns 5005842 ns 140 bytes_per_second=190.512M/s items_per_second=199.767/s
crc32_bitwise_cpp/100000000 500487025 ns 500478188 ns 1 bytes_per_second=190.553M/s items_per_second=1.99809/s
crc32_bitwise_cpp/1000000000 5004175087 ns 5004055360 ns 1 bytes_per_second=190.58M/s items_per_second=0.199838/s
crc32_bitwise_branch/1 2.80 ns 2.80 ns 250112181 bytes_per_second=340.829M/s items_per_second=357.386M/s
crc32_bitwise_branch/100 560 ns 560 ns 1246915 bytes_per_second=170.324M/s items_per_second=1.78597M/s
crc32_bitwise_branch/10000 56682 ns 56681 ns 12344 bytes_per_second=168.254M/s items_per_second=17.6427k/s
crc32_bitwise_branch/1000000 5678142 ns 5678046 ns 123 bytes_per_second=167.958M/s items_per_second=176.117/s
crc32_bitwise_branch/100000000 567653861 ns 567638059 ns 1 bytes_per_second=168.007M/s items_per_second=1.76169/s
crc32_bitwise_branch/1000000000 5672185016 ns 5672081957 ns 1 bytes_per_second=168.135M/s items_per_second=0.176302/s
crc32_bitwise_branch_cpp/1 2.82 ns 2.82 ns 244953580 bytes_per_second=338.636M/s items_per_second=355.086M/s
crc32_bitwise_branch_cpp/100 561 ns 561 ns 1246248 bytes_per_second=170.115M/s items_per_second=1.78379M/s
crc32_bitwise_branch_cpp/10000 56685 ns 56681 ns 12341 bytes_per_second=168.254M/s items_per_second=17.6427k/s
crc32_bitwise_branch_cpp/1000000 5671752 ns 5671747 ns 123 bytes_per_second=168.145M/s items_per_second=176.313/s
crc32_bitwise_branch_cpp/100000000 567790614 ns 567776153 ns 1 bytes_per_second=167.967M/s items_per_second=1.76126/s
crc32_bitwise_branch_cpp/1000000000 5732593606 ns 5732573572 ns 1 bytes_per_second=166.361M/s items_per_second=0.174442/s
crc32_halfbyte/1 1.45 ns 1.45 ns 483260862 bytes_per_second=657.715M/s items_per_second=689.664M/s
crc32_halfbyte/100 346 ns 346 ns 2023895 bytes_per_second=275.865M/s items_per_second=2.89265M/s
crc32_halfbyte/10000 36758 ns 36758 ns 19045 bytes_per_second=259.45M/s items_per_second=27.2053k/s
crc32_halfbyte/1000000 3684212 ns 3684157 ns 190 bytes_per_second=258.858M/s items_per_second=271.433/s
crc32_halfbyte/100000000 362730159 ns 362726754 ns 2 bytes_per_second=262.918M/s items_per_second=2.7569/s
crc32_halfbyte/1000000000 3621702438 ns 3621634538 ns 1 bytes_per_second=263.327M/s items_per_second=0.276118/s
crc32_halfbyte_cpp/1 1.61 ns 1.61 ns 435424010 bytes_per_second=592.443M/s items_per_second=621.222M/s
crc32_halfbyte_cpp/100 340 ns 340 ns 2055250 bytes_per_second=280.59M/s items_per_second=2.9422M/s
crc32_halfbyte_cpp/10000 36196 ns 36196 ns 19350 bytes_per_second=263.478M/s items_per_second=27.6277k/s
crc32_halfbyte_cpp/1000000 3629417 ns 3629392 ns 193 bytes_per_second=262.764M/s items_per_second=275.528/s
crc32_halfbyte_cpp/100000000 362798325 ns 362794757 ns 2 bytes_per_second=262.869M/s items_per_second=2.75638/s
crc32_halfbyte_cpp/1000000000 3645203962 ns 3645120058 ns 1 bytes_per_second=261.63M/s items_per_second=0.274339/s
crc32_1byte/1 1.39 ns 1.39 ns 504452841 bytes_per_second=684.842M/s items_per_second=718.109M/s
crc32_1byte/100 162 ns 162 ns 4314588 bytes_per_second=588.03M/s items_per_second=6.16594M/s
crc32_1byte/10000 18224 ns 18224 ns 38407 bytes_per_second=523.298M/s items_per_second=54.8717k/s
crc32_1byte/1000000 1824865 ns 1824821 ns 383 bytes_per_second=522.612M/s items_per_second=547.999/s
crc32_1byte/100000000 182451179 ns 182447149 ns 4 bytes_per_second=522.713M/s items_per_second=5.48104/s
crc32_1byte/1000000000 1824629440 ns 1824591087 ns 1 bytes_per_second=522.678M/s items_per_second=0.548068/s
crc32_1byte_cpp/1 1.39 ns 1.39 ns 504701380 bytes_per_second=687.207M/s items_per_second=720.589M/s
crc32_1byte_cpp/100 164 ns 164 ns 4267557 bytes_per_second=581.398M/s items_per_second=6.0964M/s
crc32_1byte_cpp/10000 18234 ns 18234 ns 38386 bytes_per_second=523.026M/s items_per_second=54.8433k/s
crc32_1byte_cpp/1000000 1828702 ns 1828657 ns 383 bytes_per_second=521.516M/s items_per_second=546.849/s
crc32_1byte_cpp/100000000 183149467 ns 183142091 ns 4 bytes_per_second=520.729M/s items_per_second=5.46024/s
crc32_1byte_cpp/1000000000 1827703854 ns 1827661536 ns 1 bytes_per_second=521.8M/s items_per_second=0.547147/s
crc32_1byte_tableless/1 2.09 ns 2.09 ns 335717284 bytes_per_second=456.135M/s items_per_second=478.293M/s
crc32_1byte_tableless/100 329 ns 329 ns 2130088 bytes_per_second=290.214M/s items_per_second=3.04312M/s
crc32_1byte_tableless/10000 33083 ns 33083 ns 21158 bytes_per_second=288.27M/s items_per_second=30.2273k/s
crc32_1byte_tableless/1000000 3311088 ns 3311056 ns 211 bytes_per_second=288.027M/s items_per_second=302.018/s
crc32_1byte_tableless/100000000 329279311 ns 329256712 ns 2 bytes_per_second=289.645M/s items_per_second=3.03714/s
crc32_1byte_tableless/1000000000 3291815269 ns 3291746132 ns 1 bytes_per_second=289.717M/s items_per_second=0.30379/s
crc32_1byte_tableless_cpp/1 2.29 ns 2.29 ns 306305667 bytes_per_second=417.337M/s items_per_second=437.61M/s
crc32_1byte_tableless_cpp/100 316 ns 316 ns 2215132 bytes_per_second=301.78M/s items_per_second=3.1644M/s
crc32_1byte_tableless_cpp/10000 31809 ns 31809 ns 22012 bytes_per_second=299.809M/s items_per_second=31.4373k/s
crc32_1byte_tableless_cpp/1000000 3185729 ns 3185635 ns 220 bytes_per_second=299.367M/s items_per_second=313.909/s
crc32_1byte_tableless_cpp/100000000 318453857 ns 318445552 ns 2 bytes_per_second=299.478M/s items_per_second=3.14025/s
crc32_1byte_tableless_cpp/1000000000 3186034157 ns 3185960089 ns 1 bytes_per_second=299.337M/s items_per_second=0.313877/s
crc32_1byte_tableless2/1 1.61 ns 1.61 ns 431599269 bytes_per_second=591.232M/s items_per_second=619.952M/s
crc32_1byte_tableless2/100 536 ns 536 ns 1302417 bytes_per_second=177.925M/s items_per_second=1.86568M/s
crc32_1byte_tableless2/10000 55923 ns 55923 ns 12525 bytes_per_second=170.534M/s items_per_second=17.8818k/s
crc32_1byte_tableless2/1000000 5595563 ns 5595561 ns 125 bytes_per_second=170.434M/s items_per_second=178.713/s
crc32_1byte_tableless2/100000000 559887720 ns 559852298 ns 1 bytes_per_second=170.344M/s items_per_second=1.78619/s
crc32_1byte_tableless2/1000000000 5593138100 ns 5593007169 ns 1 bytes_per_second=170.512M/s items_per_second=0.178795/s
crc32_1byte_tableless2_cpp/1 1.61 ns 1.61 ns 427281387 bytes_per_second=591.829M/s items_per_second=620.578M/s
crc32_1byte_tableless2_cpp/100 536 ns 536 ns 1302886 bytes_per_second=177.882M/s items_per_second=1.86523M/s
crc32_1byte_tableless2_cpp/10000 56274 ns 56273 ns 12511 bytes_per_second=169.473M/s items_per_second=17.7705k/s
crc32_1byte_tableless2_cpp/1000000 5634062 ns 5633860 ns 124 bytes_per_second=169.275M/s items_per_second=177.498/s
crc32_1byte_tableless2_cpp/100000000 563027564 ns 563027403 ns 1 bytes_per_second=169.383M/s items_per_second=1.77611/s
crc32_1byte_tableless2_cpp/1000000000 5622141500 ns 5622015899 ns 1 bytes_per_second=169.632M/s items_per_second=0.177872/s
crc32_4bytes/1 1.62 ns 1.62 ns 430719792 bytes_per_second=588.752M/s items_per_second=617.352M/s
crc32_4bytes/100 51.1 ns 51.1 ns 13689748 bytes_per_second=1.82394G/s items_per_second=19.5844M/s
crc32_4bytes/10000 6358 ns 6358 ns 111193 bytes_per_second=1.46489G/s items_per_second=157.292k/s
crc32_4bytes/1000000 647585 ns 647587 ns 1082 bytes_per_second=1.43814G/s items_per_second=1.54419k/s
crc32_4bytes/100000000 64515189 ns 64513772 ns 11 bytes_per_second=1.4436G/s items_per_second=15.5006/s
crc32_4bytes/1000000000 637657681 ns 637637066 ns 1 bytes_per_second=1.46058G/s items_per_second=1.56829/s
crc32_4bytes_cpp/1 1.85 ns 1.85 ns 378604170 bytes_per_second=515.114M/s items_per_second=540.136M/s
crc32_4bytes_cpp/100 51.8 ns 51.8 ns 13383244 bytes_per_second=1.7988G/s items_per_second=19.3145M/s
crc32_4bytes_cpp/10000 6351 ns 6351 ns 109795 bytes_per_second=1.4664G/s items_per_second=157.453k/s
crc32_4bytes_cpp/1000000 638550 ns 638551 ns 1096 bytes_per_second=1.45849G/s items_per_second=1.56605k/s
crc32_4bytes_cpp/100000000 63820526 ns 63819878 ns 11 bytes_per_second=1.4593G/s items_per_second=15.6691/s
crc32_4bytes_cpp/1000000000 638677154 ns 638662759 ns 1 bytes_per_second=1.45824G/s items_per_second=1.56577/s
crc32_8bytes/1 1.87 ns 1.87 ns 370255307 bytes_per_second=509.995M/s items_per_second=534.769M/s
crc32_8bytes/100 29.5 ns 29.5 ns 24110858 bytes_per_second=3.16032G/s items_per_second=33.9337M/s
crc32_8bytes/10000 3444 ns 3444 ns 203162 bytes_per_second=2.70388G/s items_per_second=290.327k/s
crc32_8bytes/1000000 350290 ns 350285 ns 1994 bytes_per_second=2.65875G/s items_per_second=2.85481k/s
crc32_8bytes/100000000 34980817 ns 34980472 ns 20 bytes_per_second=2.66241G/s items_per_second=28.5874/s
crc32_8bytes/1000000000 349634826 ns 349635103 ns 2 bytes_per_second=2.6637G/s items_per_second=2.86012/s
crc32_8bytes_cpp/1 1.87 ns 1.87 ns 369593783 bytes_per_second=510.276M/s items_per_second=535.063M/s
crc32_8bytes_cpp/100 30.1 ns 30.1 ns 23047169 bytes_per_second=3.08963G/s items_per_second=33.1747M/s
crc32_8bytes_cpp/10000 3495 ns 3495 ns 200210 bytes_per_second=2.66487G/s items_per_second=286.138k/s
crc32_8bytes_cpp/1000000 354545 ns 354546 ns 1971 bytes_per_second=2.6268G/s items_per_second=2.82051k/s
crc32_8bytes_cpp/100000000 35400921 ns 35400156 ns 20 bytes_per_second=2.63084G/s items_per_second=28.2485/s
crc32_8bytes_cpp/1000000000 354144078 ns 354144486 ns 2 bytes_per_second=2.62978G/s items_per_second=2.82371/s
crc32_4x8bytes/1 2.34 ns 2.34 ns 299022125 bytes_per_second=407.377M/s items_per_second=427.166M/s
crc32_4x8bytes/100 30.4 ns 30.4 ns 23062086 bytes_per_second=3.0628G/s items_per_second=32.8866M/s
crc32_4x8bytes/10000 3277 ns 3277 ns 213958 bytes_per_second=2.8421G/s items_per_second=305.168k/s
crc32_4x8bytes/1000000 331368 ns 331361 ns 2112 bytes_per_second=2.8106G/s items_per_second=3.01785k/s
crc32_4x8bytes/100000000 33075367 ns 33074974 ns 21 bytes_per_second=2.81579G/s items_per_second=30.2343/s
crc32_4x8bytes/1000000000 331799366 ns 331792182 ns 2 bytes_per_second=2.80695G/s items_per_second=3.01393/s
crc32_4x8bytes_cpp/1 1.86 ns 1.86 ns 374799357 bytes_per_second=513.517M/s items_per_second=538.461M/s
crc32_4x8bytes_cpp/100 24.6 ns 24.6 ns 28183278 bytes_per_second=3.7907G/s items_per_second=40.7024M/s
crc32_4x8bytes_cpp/10000 3093 ns 3093 ns 225809 bytes_per_second=3.01129G/s items_per_second=323.335k/s
crc32_4x8bytes_cpp/1000000 309379 ns 309376 ns 2248 bytes_per_second=3.01032G/s items_per_second=3.23231k/s
crc32_4x8bytes_cpp/100000000 30999471 ns 30998960 ns 23 bytes_per_second=3.00437G/s items_per_second=32.2591/s
crc32_4x8bytes_cpp/1000000000 310033987 ns 310028625 ns 2 bytes_per_second=3.00399G/s items_per_second=3.22551/s
crc32_16bytes/1 2.09 ns 2.09 ns 335598236 bytes_per_second=455.502M/s items_per_second=477.628M/s
crc32_16bytes/100 78.4 ns 78.4 ns 8895975 bytes_per_second=1.1874G/s items_per_second=12.7496M/s
crc32_16bytes/10000 1847 ns 1846 ns 379509 bytes_per_second=5.04376G/s items_per_second=541.57k/s
crc32_16bytes/1000000 190295 ns 190291 ns 3674 bytes_per_second=4.89419G/s items_per_second=5.2551k/s
crc32_16bytes/100000000 19286231 ns 19285510 ns 36 bytes_per_second=4.82913G/s items_per_second=51.8524/s
crc32_16bytes/1000000000 190687942 ns 190684723 ns 4 bytes_per_second=4.8841G/s items_per_second=5.24426/s
crc32_16bytes_cpp/1 1.63 ns 1.63 ns 425090921 bytes_per_second=584.29M/s items_per_second=612.673M/s
crc32_16bytes_cpp/100 54.0 ns 54.0 ns 12806556 bytes_per_second=1.72486G/s items_per_second=18.5205M/s
crc32_16bytes_cpp/10000 1555 ns 1555 ns 449788 bytes_per_second=5.99035G/s items_per_second=643.209k/s
crc32_16bytes_cpp/1000000 153745 ns 153744 ns 4555 bytes_per_second=6.05761G/s items_per_second=6.50431k/s
crc32_16bytes_cpp/100000000 15447151 ns 15446982 ns 45 bytes_per_second=6.02916G/s items_per_second=64.7376/s
crc32_16bytes_cpp/1000000000 154522664 ns 154521538 ns 5 bytes_per_second=6.02714G/s items_per_second=6.47159/s
crc32_16bytes_prefetch/1 2.33 ns 2.33 ns 298292072 bytes_per_second=408.592M/s items_per_second=428.44M/s
crc32_16bytes_prefetch/100 163 ns 163 ns 4283416 bytes_per_second=584.45M/s items_per_second=6.12841M/s
crc32_16bytes_prefetch/10000 2252 ns 2252 ns 310882 bytes_per_second=4.13523G/s items_per_second=444.017k/s
crc32_16bytes_prefetch/1000000 196168 ns 196168 ns 3692 bytes_per_second=4.74758G/s items_per_second=5.09767k/s
crc32_16bytes_prefetch/100000000 19077968 ns 19077720 ns 37 bytes_per_second=4.88173G/s items_per_second=52.4172/s
crc32_16bytes_prefetch/1000000000 190150413 ns 190141612 ns 4 bytes_per_second=4.89805G/s items_per_second=5.25924/s
crc32_16bytes_prefetch_cpp/1 1.86 ns 1.86 ns 373440442 bytes_per_second=511.532M/s items_per_second=536.381M/s
crc32_16bytes_prefetch_cpp/100 163 ns 163 ns 4308163 bytes_per_second=585.9M/s items_per_second=6.14361M/s
crc32_16bytes_prefetch_cpp/10000 2041 ns 2041 ns 343215 bytes_per_second=4.564G/s items_per_second=490.055k/s
crc32_16bytes_prefetch_cpp/1000000 159875 ns 159871 ns 4380 bytes_per_second=5.82545G/s items_per_second=6.25503k/s
crc32_16bytes_prefetch_cpp/100000000 16217677 ns 16216935 ns 44 bytes_per_second=5.7429G/s items_per_second=61.6639/s
crc32_16bytes_prefetch_cpp/1000000000 160260867 ns 160251534 ns 4 bytes_per_second=5.81163G/s items_per_second=6.24019/s
Results of github action: https://github.com/bensuperpc/crc32/actions Graph code (Based on this code): https://int-i.github.io/python/2021-11-07/matplotlib-google-benchmark-visualization/
Sorry for my imperfect English, I'm French