crc32 icon indicating copy to clipboard operation
crc32 copied to clipboard

Add CMake, github action, google test and benchmark...

Open bensuperpc opened this issue 3 years ago • 0 comments

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):

benchmark

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

bensuperpc avatar Nov 06 '21 16:11 bensuperpc