2021-11-06 Clang 10 Release ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../../kblib/poly_obj.cpp:440 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 710 2.982 ms 42.7097 ns 42.6198 ns 43.1382 ns 0.854405 ns 0.0459853 ns 2.03295 ns raw pointer 100 139 3.058 ms 219.893 ns 219.48 ns 220.952 ns 2.93546 ns 0.314067 ns 5.39008 ns unique_ptr 100 122 3.05 ms 249.485 ns 248.994 ns 250.487 ns 3.45673 ns 1.92973 ns 5.57852 ns poly_obj 100 122 3.05 ms 249.18 ns 248.039 ns 253.748 ns 9.66183 ns 0.117112 ns 22.6528 ns function pointer 100 121 3.0371 ms 249.432 ns 249.417 ns 249.488 ns 0.134661 ns 0.0401571 ns 0.330497 ns function pointer (wrapped) 100 139 3.058 ms 219.442 ns 219.419 ns 219.536 ns 0.214959 ns 0.0335418 ns 0.506591 ns std::function 100 137 3.0551 ms 222.584 ns 222.427 ns 223.315 ns 1.46275 ns 0.0387213 ns 3.47537 ns std::visit(v, f) 100 122 3.0622 ms 282.825 ns 280.232 ns 284.669 ns 11.1284 ns 8.25303 ns 13.8457 ns kblib::visit(v, f...) 100 138 3.0498 ms 221.048 ns 220.011 ns 226.153 ns 10.1641 ns 0.0763897 ns 24.2511 ns kblib::visit(v)(f...) 100 104 3.068 ms 250.073 ns 249.837 ns 250.955 ns 1.982 ns 0.207802 ns 4.52207 ns visit_indexed(v, f...) 100 137 3.0551 ms 220.98 ns 220.404 ns 222.47 ns 4.16637 ns 0.42495 ns 8.21245 ns kblib::visit2(v, f...) 100 229 3.0457 ms 132.672 ns 132.421 ns 133.171 ns 1.74935 ns 0.968725 ns 2.75972 ns kblib::visit2_nop(v, f...) 100 151 3.0502 ms 201.191 ns 199.982 ns 204.483 ns 8.99784 ns 1.8871 ns 18.2584 ns std::get_if 100 233 3.0523 ms 132.136 ns 130.642 ns 135.207 ns 10.4568 ns 6.05407 ns 18.2095 ns switch (v.index()) 100 160 3.056 ms 193.734 ns 190.377 ns 197.897 ns 19.0197 ns 16.142 ns 24.103 ns raw pointer, ch 100 44 3.102 ms 702.218 ns 701.407 ns 705.523 ns 6.85119 ns 0.37825 ns 15.8979 ns unique_ptr, ch 100 135 3.051 ms 220.454 ns 220.224 ns 221.526 ns 2.1537 ns 0.19267 ns 5.11451 ns poly_obj, ch 100 44 3.0976 ms 703.795 ns 702.689 ns 708.982 ns 10.3589 ns 0.177738 ns 24.6525 ns std::function, ch 100 47 3.0879 ms 646.399 ns 645.764 ns 648.173 ns 4.85972 ns 0.979588 ns 9.86348 ns kblib::visit2_nop(v, f...), ch 100 66 3.0624 ms 464.325 ns 462.929 ns 470.681 ns 12.7117 ns 0.105718 ns 30.2027 ns std::get_if, ch 100 211 3.0384 ms 152.446 ns 151.999 ns 153.082 ns 2.70412 ns 2.03346 ns 3.36729 ns switch (v.index()), ch 100 53 3.0793 ms 597.081 ns 595.904 ns 602.591 ns 11.0831 ns 0.862163 ns 26.3412 ns std::function, ex 100 49 3.1066 ms 636.086 ns 635.87 ns 637.147 ns 2.10972 ns 0.0765282 ns 4.62158 ns std::visit(v, f), ex 100 44 3.0888 ms 703.368 ns 703.297 ns 703.641 ns 0.661542 ns 0.063651 ns 1.56967 ns kblib::visit(v, f...), ex 100 45 3.0555 ms 680.853 ns 679.668 ns 683.662 ns 8.73759 ns 2.89708 ns 15.5048 ns kblib::visit(v)(f...), ex 100 44 3.058 ms 698.486 ns 698.407 ns 698.788 ns 0.705482 ns 0.1222 ns 1.65692 ns visit_indexed(v, f...), ex 100 46 3.0866 ms 676.703 ns 675.905 ns 678.715 ns 6.12295 ns 3.13527 ns 12.7667 ns kblib::visit2(v, f...), ex 100 62 3.069 ms 489.789 ns 489.114 ns 492.233 ns 5.40922 ns 0.0789605 ns 12.439 ns Profiling took 26.5908 seconds 2021-08-17 Clang 10 Release ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../../kblib/poly_obj.cpp:415 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 689 3.0316 ms 46.7635 ns 45.8875 ns 48.2069 ns 5.6079 ns 3.4211 ns 8.888 ns raw pointer 100 138 3.0912 ms 221.641 ns 220.569 ns 224.019 ns 7.71788 ns 3.66957 ns 13.1106 ns unique_ptr 100 138 3.0774 ms 227.54 ns 223.76 ns 233.096 ns 23.109 ns 17.2071 ns 29.4211 ns poly_obj 100 139 3.0719 ms 233.231 ns 229.724 ns 237.716 ns 20.0773 ns 17.0077 ns 28.3226 ns std::function 100 137 3.0688 ms 232.252 ns 227.827 ns 238.138 ns 25.7569 ns 20.7343 ns 30.616 ns std::visit(v, f) 100 138 3.0912 ms 221.794 ns 221.097 ns 223.739 ns 5.24651 ns 0.962103 ns 10.9769 ns kblib::visit(v, f...) 100 122 3.0744 ms 250.124 ns 249.758 ns 251.59 ns 3.23901 ns 0.648097 ns 7.5349 ns kblib::visit(v)(f...) 100 134 3.0686 ms 243.09 ns 242.184 ns 243.346 ns 2.23537 ns 0.419061 ns 5.21688 ns visit_indexed(v, f...) 100 123 3.075 ms 250.089 ns 249.707 ns 251.824 ns 3.47541 ns 0.0499404 ns 8.25113 ns kblib::visit2(v, f...) 100 156 3.0888 ms 215.135 ns 211.873 ns 218.732 ns 17.3867 ns 15.3133 ns 21.3289 ns kblib::visit2_nop(v, f...) 100 155 3.0845 ms 198.807 ns 198.566 ns 199.881 ns 2.19278 ns 0.148111 ns 5.16929 ns std::get_if 100 246 3.075 ms 138.148 ns 136.191 ns 141.023 ns 11.8952 ns 8.35871 ns 17.8865 ns switch (v.index()) 100 144 3.0816 ms 233.336 ns 232.676 ns 234.265 ns 3.93145 ns 2.88773 ns 6.74255 ns raw pointer, ch 100 45 3.132 ms 699.949 ns 694.66 ns 708.246 ns 33.1543 ns 23.4852 ns 45.5948 ns unique_ptr, ch 100 136 3.0872 ms 235.063 ns 229.061 ns 243.797 ns 36.4847 ns 27.3813 ns 46.6664 ns poly_obj, ch 100 48 3.1104 ms 643.273 ns 642.638 ns 645.573 ns 5.08171 ns 0.0688371 ns 11.6872 ns std::function, ch 100 47 3.102 ms 647.054 ns 645.074 ns 656.051 ns 17.9896 ns 0.116835 ns 42.7395 ns kblib::visit2_nop(v, f...), ch 100 62 3.0938 ms 484.275 ns 482.286 ns 489.608 ns 15.3528 ns 6.97178 ns 32.0031 ns std::get_if, ch 100 221 3.0719 ms 137.466 ns 136.981 ns 138.474 ns 3.44201 ns 2.0782 ns 6.22604 ns switch (v.index()), ch 100 54 3.1104 ms 583.495 ns 582.452 ns 585.334 ns 6.86041 ns 4.56713 ns 12.7209 ns std::function, ex 100 44 3.0888 ms 651.217 ns 649.666 ns 653.902 ns 10.125 ns 6.79432 ns 16.1242 ns std::visit(v, f), ex 100 47 3.1067 ms 663.327 ns 661.159 ns 667.704 ns 15.1271 ns 9.01236 ns 26.6251 ns kblib::visit(v, f...), ex 100 46 3.1234 ms 678.982 ns 676.247 ns 683.881 ns 18.1805 ns 11.4708 ns 26.0526 ns kblib::visit(v)(f...), ex 100 44 3.1152 ms 707.209 ns 706.12 ns 711.994 ns 9.80942 ns 0.789794 ns 23.0556 ns visit_indexed(v, f...), ex 100 42 3.0954 ms 728.827 ns 727.044 ns 732.774 ns 12.8369 ns 7.28609 ns 24.5392 ns kblib::visit2(v, f...), ex 100 59 3.1034 ms 531.719 ns 526.015 ns 542.623 ns 38.7198 ns 23.0523 ns 59.5093 ns Profiling took 25.1483 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../../kblib/poly_obj.cpp:408 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 586 3.1058 ms 55.3085 ns 54.9533 ns 55.683 ns 1.85606 ns 1.75751 ns 2.24496 ns raw pointer 100 139 3.1136 ms 220.363 ns 219.928 ns 222.428 ns 4.1535 ns 0.212727 ns 9.88978 ns unique_ptr 100 124 3.1248 ms 250.752 ns 249.544 ns 253.303 ns 8.59439 ns 4.68242 ns 13.7015 ns poly_obj 100 140 3.108 ms 221.17 ns 219.497 ns 225.622 ns 12.3627 ns 2.56835 ns 22.8168 ns std::function 100 140 3.122 ms 220.867 ns 219.689 ns 225.251 ns 9.69427 ns 0.984336 ns 22.0335 ns std::visit(v, f) 100 47 3.1443 ms 662.484 ns 659.658 ns 668.042 ns 19.488 ns 11.4428 ns 31.2611 ns kblib::visit(v, f...) 100 135 3.1185 ms 248.903 ns 241.072 ns 258.594 ns 44.3416 ns 37.3498 ns 51.5699 ns kblib::visit(v)(f...) 100 48 3.168 ms 663.797 ns 658.884 ns 672.473 ns 32.5615 ns 22.3479 ns 53.8864 ns visit_indexed(v, f...) 100 47 3.1208 ms 669.245 ns 665.927 ns 677.944 ns 25.894 ns 11.7501 ns 51.2149 ns kblib::visit2(v, f...) 100 167 3.1062 ms 182.746 ns 182.194 ns 184.69 ns 4.60998 ns 1.22113 ns 10.3971 ns kblib::visit2_nop(v, f...) 100 162 3.1104 ms 183.147 ns 182.935 ns 184.123 ns 1.95042 ns 0.0421339 ns 4.63367 ns std::get_if 100 200 3.12 ms 181.661 ns 179.934 ns 183.379 ns 8.76899 ns 6.06394 ns 13.2195 ns switch (v.index()) 100 152 3.116 ms 192.379 ns 191.492 ns 194.624 ns 6.27696 ns 0.339654 ns 11.7541 ns raw pointer, ch 100 46 3.174 ms 696.734 ns 691.58 ns 708.084 ns 37.1262 ns 16.4665 ns 63.1674 ns unique_ptr, ch 100 139 3.1136 ms 220.961 ns 220.605 ns 222.605 ns 3.33594 ns 0.290239 ns 7.92068 ns poly_obj, ch 100 48 3.168 ms 662.774 ns 659.953 ns 675.753 ns 26.6265 ns 2.49383 ns 63.2643 ns std::function, ch 100 53 3.1164 ms 587.121 ns 583.685 ns 596.238 ns 26.1549 ns 9.90803 ns 52.9658 ns kblib::visit2_nop(v, f...), ch 100 60 3.156 ms 504.749 ns 498.758 ns 516.479 ns 41.2153 ns 23.7768 ns 67.2652 ns std::get_if, ch 100 135 3.105 ms 225.6 ns 224.551 ns 226.915 ns 5.95616 ns 5.03463 ns 8.8775 ns switch (v.index()), ch 100 47 3.1255 ms 682.357 ns 673.233 ns 693.411 ns 51.1532 ns 43.683 ns 61.7825 ns std::function, ex 100 49 3.1703 ms 647.731 ns 647.645 ns 648.068 ns 0.817209 ns 0.0596966 ns 1.94342 ns std::visit(v, f), ex 100 43 3.1648 ms 734.033 ns 732.32 ns 737.402 ns 11.8234 ns 6.89896 ns 18.7791 ns kblib::visit(v, f...), ex 100 43 3.1777 ms 736.717 ns 734.17 ns 742.98 ns 19.0234 ns 6.1174 ns 33.5334 ns kblib::visit(v)(f...), ex 100 41 3.1365 ms 767.154 ns 765.204 ns 771.44 ns 14.0277 ns 6.99831 ns 25.1519 ns visit_indexed(v, f...), ex 100 44 3.1416 ms 718.603 ns 713.223 ns 731.761 ns 40.0462 ns 20.155 ns 79.9883 ns kblib::visit2(v, f...), ex 100 47 3.1255 ms 612.953 ns 608.278 ns 624.137 ns 34.7104 ns 17.9361 ns 69.5536 ns Profiling took 25.9092 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../../kblib/poly_obj.cpp:408 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 39 18.9657 ms 4.91046 us 4.88903 us 4.94467 us 135.687 ns 96.4499 ns 192.725 ns raw pointer 100 31 19.282 ms 6.22828 us 6.17285 us 6.32676 us 368.682 ns 238.732 ns 545.811 ns unique_ptr 100 16 20.1232 ms 15.3896 us 13.9674 us 17.4119 us 8.55376 us 6.73662 us 11.2175 us poly_obj 100 8 19.708 ms 17.5286 us 17.4566 us 17.7447 us 579.275 ns 231.56 ns 1.27101 us std::function 100 19 19.0798 ms 9.72621 us 9.63223 us 9.93833 us 686.273 ns 285.664 ns 1.18453 us std::visit(v, f) 100 8 20.5752 ms 26.1295 us 25.9235 us 26.5 us 1.37027 us 862.913 ns 2.09921 us kblib::visit(v, f...) 100 7 20.0788 ms 28.0089 us 27.8848 us 28.4728 us 1.07864 us 274.292 ns 2.48057 us kblib::visit(v)(f...) 100 7 22.0542 ms 31.6852 us 31.5676 us 32.1247 us 1.02946 us 244.839 ns 2.38131 us visit_indexed(v, f...) 100 8 20.6064 ms 24.1909 us 24.0307 us 24.4683 us 1.0514 us 694.441 ns 1.54877 us kblib::visit2(v, f...) 100 10 20.136 ms 20.2852 us 20.2259 us 20.3922 us 394.42 ns 256.871 ns 634.206 ns kblib::visit2_nop(v, f...) 100 8 19.884 ms 24.9813 us 24.774 us 25.3628 us 1.39333 us 870.322 ns 2.16502 us std::get_if 100 12 20.0256 ms 16.693 us 16.5135 us 16.963 us 1.10943 us 811.44 ns 1.47371 us switch (v.index()) 100 12 19.7112 ms 16.4179 us 16.3854 us 16.474 us 211.942 ns 142.571 ns 324.524 ns raw pointer, ch 100 33 19.2885 ms 5.81314 us 5.79296 us 5.84602 us 129.243 ns 89.1896 ns 183.973 ns unique_ptr, ch 100 12 19.0812 ms 16.1598 us 15.9907 us 16.4397 us 1.08857 us 759.44 ns 1.6232 us poly_obj, ch 100 14 19.1142 ms 13.7899 us 13.6974 us 13.9992 us 671.369 ns 304.511 ns 1.14633 us std::function, ch 100 20 19.768 ms 10.1655 us 10.0211 us 10.3793 us 885.035 ns 661.928 ns 1.17086 us kblib::visit2_nop(v, f...), ch 100 8 19.5792 ms 24.4492 us 24.3793 us 24.5532 us 433.308 ns 318.591 ns 572.203 ns std::get_if, ch 100 11 19.0047 ms 17.4531 us 17.2958 us 17.8931 us 1.23709 us 554.805 ns 2.64269 us switch (v.index()), ch 100 12 19.4712 ms 16.1517 us 16.0643 us 16.3065 us 579.233 ns 376.798 ns 888.406 ns std::function, ex 100 21 19.4775 ms 9.46789 us 9.34191 us 9.65136 us 768.282 ns 591.203 ns 1.00574 us std::visit(v, f), ex 100 8 20.5472 ms 25.8284 us 25.6458 us 26.1748 us 1.24894 us 769.963 ns 1.93702 us kblib::visit(v, f...), ex 100 7 21.0903 ms 27.7466 us 27.4873 us 28.2375 us 1.76091 us 1.13325 us 2.97388 us kblib::visit(v)(f...), ex 100 6 19.4022 ms 32.9813 us 32.5463 us 33.5805 us 2.5764 us 2.01952 us 3.22648 us visit_indexed(v, f...), ex 100 8 20.8064 ms 25.6299 us 25.4799 us 25.9322 us 1.04848 us 545.717 ns 1.74022 us kblib::visit2(v, f...), ex 100 9 20.0493 ms 22.1699 us 22.0324 us 22.5109 us 1.02712 us 486.33 ns 2.03571 us Profiling took 184.053 seconds New implementation for poly_obj, with std::launder: Release, mtune=native, 110.668 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 111 11.0667 ms 957 ns 949 ns 968 ns 46 ns 33 ns 63 ns raw pointer 100 108 11.1132 ms 987 ns 980 ns 1.001 us 49 ns 32 ns 84 ns unique_ptr 100 71 11.2038 ms 1.649 us 1.593 us 1.717 us 314 ns 268 ns 366 ns poly_obj 100 116 11.1476 ms 933 ns 926 ns 957 ns 62 ns 25 ns 133 ns std::function 100 58 11.2404 ms 2.75 us 2.526 us 2.969 us 1.129 us 1.085 us 1.194 us std::visit(v, f) 100 18 11.1582 ms 6.052 us 5.926 us 6.236 us 769 ns 566 ns 1.003 us kblib::visit(v, f...) 100 16 11.5744 ms 6.813 us 6.737 us 6.932 us 476 ns 340 ns 661 ns kblib::visit(v)(f...) 100 16 11.2032 ms 7.058 us 7.006 us 7.154 us 348 ns 216 ns 541 ns visit_indexed(v, f...) 100 21 11.1489 ms 5.318 us 5.253 us 5.441 us 441 ns 280 ns 714 ns kblib::visit2(v, f...) 100 47 11.2706 ms 2.645 us 2.536 us 2.764 us 578 ns 528 ns 646 ns kblib::visit2_nop(v, f...) 100 47 11.2659 ms 2.557 us 2.529 us 2.595 us 166 ns 126 ns 217 ns std::get_if 100 52 11.1384 ms 2.137 us 2.115 us 2.187 us 155 ns 55 ns 277 ns switch (v.index()) 100 64 11.0912 ms 2.083 us 1.962 us 2.222 us 661 ns 587 ns 718 ns raw pointer, ch 100 79 11.06 ms 1.382 us 1.378 us 1.389 us 28 ns 19 ns 39 ns unique_ptr, ch 100 50 11.1 ms 2.134 us 2.095 us 2.197 us 249 ns 170 ns 369 ns poly_obj, ch 100 63 11.1132 ms 1.765 us 1.722 us 1.919 us 367 ns 97 ns 843 ns std::function, ch 100 49 11.0642 ms 2.364 us 2.254 us 2.498 us 615 ns 527 ns 694 ns kblib::visit2_nop(v, f...), ch 100 39 11.1618 ms 3.153 us 3.036 us 3.279 us 616 ns 565 ns 681 ns std::get_if, ch 100 37 11.3035 ms 3.23 us 3.132 us 3.35 us 552 ns 469 ns 633 ns switch (v.index()), ch 100 46 11.1044 ms 2.351 us 2.343 us 2.365 us 54 ns 37 ns 76 ns std::function, ex 100 54 11.2212 ms 1.946 us 1.933 us 1.968 us 86 ns 58 ns 131 ns std::visit(v, f), ex 100 17 11.4342 ms 6.198 us 6.136 us 6.305 us 401 ns 281 ns 656 ns kblib::visit(v, f...), ex 100 15 11.1825 ms 7.361 us 7.268 us 7.513 us 596 ns 411 ns 841 ns kblib::visit(v)(f...), ex 100 17 11.4291 ms 6.741 us 6.664 us 6.896 us 536 ns 300 ns 869 ns visit_indexed(v, f...), ex 100 23 11.546 ms 5.096 us 5.029 us 5.198 us 414 ns 302 ns 554 ns kblib::visit2(v, f...), ex 100 38 11.3316 ms 3.424 us 3.275 us 3.599 us 823 ns 731 ns 894 ns Profiling took 110.668 seconds Release, march=native, 110.545 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 134 13.4134 ms 983 ns 965 ns 1.01 us 111 ns 77 ns 158 ns raw pointer 100 133 13.4596 ms 985 ns 978 ns 995 ns 42 ns 30 ns 57 ns unique_ptr 100 85 13.5405 ms 1.474 us 1.458 us 1.503 us 106 ns 67 ns 156 ns poly_obj 100 141 13.4373 ms 974 ns 955 ns 1.002 us 115 ns 87 ns 157 ns std::function 100 84 13.4232 ms 1.476 us 1.453 us 1.528 us 168 ns 92 ns 311 ns std::visit(v, f) 100 21 13.7508 ms 6.882 us 6.597 us 7.205 us 1.544 us 1.382 us 1.728 us kblib::visit(v, f...) 100 20 13.588 ms 7.202 us 6.994 us 7.515 us 1.282 us 951 ns 1.697 us kblib::visit(v)(f...) 100 17 13.464 ms 7.291 us 7.161 us 7.498 us 823 ns 591 ns 1.175 us visit_indexed(v, f...) 100 26 13.9048 ms 5.105 us 5.081 us 5.15 us 161 ns 102 ns 257 ns kblib::visit2(v, f...) 100 66 13.4442 ms 2.278 us 2.235 us 2.348 us 273 ns 193 ns 416 ns kblib::visit2_nop(v, f...) 100 56 13.3952 ms 2.516 us 2.496 us 2.542 us 114 ns 82 ns 185 ns std::get_if 100 62 13.4354 ms 2.849 us 2.668 us 3.052 us 981 ns 888 ns 1.052 us switch (v.index()) 100 80 13.512 ms 1.749 us 1.707 us 1.822 us 277 ns 177 ns 405 ns raw pointer, ch 100 95 13.433 ms 1.425 us 1.402 us 1.477 us 166 ns 90 ns 323 ns unique_ptr, ch 100 64 13.4912 ms 2.194 us 2.161 us 2.269 us 236 ns 125 ns 476 ns poly_obj, ch 100 77 13.4596 ms 1.745 us 1.732 us 1.766 us 84 ns 60 ns 117 ns std::function, ch 100 66 13.4574 ms 2.019 us 2.004 us 2.043 us 95 ns 67 ns 151 ns kblib::visit2_nop(v, f...), ch 100 48 13.5312 ms 2.59 us 2.582 us 2.607 us 58 ns 28 ns 97 ns std::get_if, ch 100 44 13.4772 ms 2.951 us 2.938 us 2.981 us 97 ns 52 ns 165 ns switch (v.index()), ch 100 55 13.629 ms 2.366 us 2.349 us 2.395 us 112 ns 78 ns 156 ns std::function, ex 100 69 13.4757 ms 1.944 us 1.928 us 1.998 us 130 ns 39 ns 296 ns std::visit(v, f), ex 100 18 13.5468 ms 6.283 us 6.152 us 6.523 us 877 ns 571 ns 1.451 us kblib::visit(v, f...), ex 100 18 13.752 ms 7.273 us 7.213 us 7.39 us 412 ns 257 ns 724 ns kblib::visit(v)(f...), ex 100 19 14.0619 ms 6.657 us 6.637 us 6.695 us 137 ns 84 ns 206 ns visit_indexed(v, f...), ex 100 26 13.7098 ms 4.999 us 4.965 us 5.062 us 231 ns 146 ns 364 ns kblib::visit2(v, f...), ex 100 47 13.5501 ms 2.926 us 2.891 us 2.978 us 211 ns 157 ns 280 ns Profiling took 110.545 seconds Release, generic, 110.378 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 110 10.912 ms 963 ns 953 ns 982 ns 69 ns 44 ns 103 ns raw pointer 100 97 10.9416 ms 1.032 us 1.007 us 1.066 us 147 ns 113 ns 183 ns unique_ptr 100 69 11.0124 ms 1.621 us 1.595 us 1.668 us 173 ns 105 ns 291 ns poly_obj 100 110 10.945 ms 957 ns 938 ns 997 ns 132 ns 72 ns 212 ns std::function 100 64 11.04 ms 1.58 us 1.511 us 1.712 us 470 ns 281 ns 733 ns std::visit(v, f) 100 19 11.3145 ms 6.85 us 6.501 us 7.283 us 1.972 us 1.646 us 2.265 us kblib::visit(v, f...) 100 16 10.9488 ms 6.993 us 6.848 us 7.195 us 864 ns 665 ns 1.085 us kblib::visit(v)(f...) 100 15 11.0295 ms 6.955 us 6.92 us 7.008 us 217 ns 153 ns 300 ns visit_indexed(v, f...) 100 22 11.3982 ms 5.137 us 5.094 us 5.216 us 290 ns 191 ns 468 ns kblib::visit2(v, f...) 100 56 10.9872 ms 2.655 us 2.497 us 2.83 us 848 ns 771 ns 911 ns kblib::visit2_nop(v, f...) 100 46 10.8974 ms 2.512 us 2.499 us 2.526 us 69 ns 49 ns 96 ns std::get_if 100 53 11.0346 ms 2.136 us 2.123 us 2.152 us 72 ns 55 ns 101 ns switch (v.index()) 100 64 10.912 ms 1.797 us 1.75 us 1.86 us 277 ns 223 ns 347 ns raw pointer, ch 100 78 11.0058 ms 1.455 us 1.426 us 1.504 us 190 ns 128 ns 266 ns unique_ptr, ch 100 43 11.0639 ms 2.109 us 2.08 us 2.156 us 184 ns 127 ns 273 ns poly_obj, ch 100 61 10.9007 ms 1.719 us 1.711 us 1.731 us 47 ns 33 ns 74 ns std::function, ch 100 53 10.918 ms 2.16 us 2.079 us 2.281 us 499 ns 365 ns 635 ns kblib::visit2_nop(v, f...), ch 100 41 10.947 ms 3.024 us 2.913 us 3.151 us 605 ns 543 ns 652 ns std::get_if, ch 100 37 10.9076 ms 3.02 us 2.986 us 3.072 us 212 ns 152 ns 289 ns switch (v.index()), ch 100 45 11.0925 ms 2.358 us 2.341 us 2.386 us 111 ns 79 ns 148 ns std::function, ex 100 49 10.9564 ms 1.982 us 1.957 us 2.042 us 184 ns 58 ns 322 ns std::visit(v, f), ex 100 17 11.0551 ms 6.064 us 6.028 us 6.123 us 231 ns 161 ns 335 ns kblib::visit(v, f...), ex 100 15 11.118 ms 7.18 us 7.167 us 7.205 us 86 ns 50 ns 136 ns kblib::visit(v)(f...), ex 100 16 11.2464 ms 6.829 us 6.743 us 6.979 us 566 ns 369 ns 840 ns visit_indexed(v, f...), ex 100 22 10.9824 ms 4.977 us 4.94 us 5.033 us 229 ns 169 ns 320 ns kblib::visit2(v, f...), ex 100 38 11.0162 ms 2.917 us 2.892 us 2.957 us 158 ns 111 ns 216 ns Profiling took 110.378 seconds Debug, 438.762 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 68 37.4272 ms 5.205 us 5.049 us 5.427 us 941 ns 713 ns 1.189 us raw pointer 100 54 37.4004 ms 7.007 us 6.874 us 7.201 us 812 ns 597 ns 1.082 us unique_ptr 100 38 37.1792 ms 10.022 us 9.817 us 10.397 us 1.369 us 890 ns 2.191 us poly_obj 100 26 38.2564 ms 14.737 us 14.559 us 15.016 us 1.122 us 797 ns 1.581 us std::function 100 27 37.6137 ms 14.229 us 13.926 us 14.758 us 1.988 us 1.289 us 3.095 us std::visit(v, f) 100 9 37.035 ms 40.378 us 39.778 us 41.412 us 3.933 us 2.61 us 5.856 us kblib::visit(v, f...) 100 9 39.9096 ms 46.23 us 45.088 us 47.648 us 6.473 us 5.379 us 7.718 us kblib::visit(v)(f...) 100 9 41.2128 ms 45.895 us 45.591 us 46.436 us 2.012 us 1.307 us 3.124 us visit_indexed(v, f...) 100 14 38.7702 ms 27.918 us 27.574 us 28.585 us 2.366 us 1.381 us 3.696 us kblib::visit2(v, f...) 100 15 38.5665 ms 25.962 us 25.517 us 26.652 us 2.789 us 1.97 us 3.806 us kblib::visit2_nop(v, f...) 100 13 38.1589 ms 30.13 us 29.531 us 32.322 us 5.178 us 1.408 us 11.883 us std::get_if 100 18 39.0564 ms 23.241 us 22.181 us 24.931 us 6.71 us 4.616 us 9.293 us switch (v.index()) 100 20 38.702 ms 19.265 us 19.146 us 19.472 us 779 ns 512 ns 1.156 us raw pointer, ch 100 55 37.444 ms 6.362 us 6.234 us 6.613 us 873 ns 526 ns 1.355 us unique_ptr, ch 100 32 37.1456 ms 14.261 us 13.521 us 15.245 us 4.317 us 3.48 us 5.512 us poly_obj, ch 100 26 37.0526 ms 14.428 us 14.15 us 14.976 us 1.913 us 1.19 us 3.392 us std::function, ch 100 23 37.5981 ms 13.898 us 13.755 us 14.153 us 951 ns 572 ns 1.51 us kblib::visit2_nop(v, f...), ch 100 11 37.5749 ms 30.295 us 30.013 us 30.732 us 1.776 us 1.253 us 2.486 us std::get_if, ch 100 18 38.673 ms 21.437 us 21.178 us 21.812 us 1.573 us 1.19 us 2.108 us switch (v.index()), ch 100 20 38.21 ms 18.656 us 18.556 us 18.845 us 677 ns 405 ns 1.089 us std::function, ex 100 28 37.3464 ms 13.2 us 13.132 us 13.315 us 440 ns 304 ns 746 ns std::visit(v, f), ex 100 10 40.672 ms 40.911 us 40.617 us 41.375 us 1.857 us 1.297 us 2.766 us kblib::visit(v, f...), ex 100 9 39.7836 ms 42.544 us 42.05 us 43.77 us 3.699 us 1.92 us 7.502 us kblib::visit(v)(f...), ex 100 6 44.3952 ms 47.174 us 46.837 us 47.693 us 2.105 us 1.536 us 3.039 us visit_indexed(v, f...), ex 100 14 39.5458 ms 28.282 us 27.992 us 28.735 us 1.822 us 1.323 us 2.601 us kblib::visit2(v, f...), ex 100 14 38.7898 ms 29.953 us 29.205 us 30.759 us 3.983 us 3.662 us 4.422 us Profiling took 438.762 seconds Old implementation: Release, -march=native: 106.104 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 108 10.4112 ms 1.151 us 1.139 us 1.161 us 55 ns 37 ns 77 ns raw pointer 100 89 10.3863 ms 1.153 us 1.141 us 1.161 us 48 ns 32 ns 65 ns unique_ptr 100 71 10.508 ms 1.698 us 1.689 us 1.708 us 48 ns 35 ns 70 ns poly_obj 100 45 10.404 ms 2.395 us 2.373 us 2.434 us 144 ns 85 ns 278 ns std::function 100 68 10.4448 ms 1.634 us 1.613 us 1.69 us 160 ns 73 ns 343 ns std::visit(v, f) 100 17 10.523 ms 6.057 us 6.049 us 6.083 us 66 ns 23 ns 145 ns kblib::visit(v, f...) 100 16 10.6752 ms 6.655 us 6.642 us 6.68 us 88 ns 50 ns 145 ns kblib::visit(v)(f...) 100 16 10.6272 ms 6.758 us 6.75 us 6.774 us 55 ns 31 ns 89 ns visit_indexed(v, f...) 100 23 10.695 ms 5.041 us 5.031 us 5.045 us 29 ns 11 ns 61 ns kblib::visit2(v, f...) 100 45 10.5795 ms 2.457 us 2.455 us 2.463 us 19 ns 7 ns 39 ns kblib::visit2_nop(v, f...) 100 41 10.5534 ms 2.701 us 2.695 us 2.704 us 22 ns 10 ns 41 ns std::get_if 100 42 10.4622 ms 2.512 us 2.506 us 2.52 us 35 ns 31 ns 44 ns switch (v.index()) 100 63 10.4265 ms 1.647 us 1.646 us 1.651 us 11 ns 6 ns 18 ns raw pointer, ch 100 74 10.4784 ms 1.562 us 1.558 us 1.565 us 18 ns 9 ns 34 ns unique_ptr, ch 100 48 10.488 ms 2.469 us 2.449 us 2.481 us 75 ns 53 ns 109 ns poly_obj, ch 100 58 10.5386 ms 2.091 us 2.079 us 2.098 us 42 ns 20 ns 72 ns std::function, ch 100 52 10.3948 ms 2.005 us 2 us 2.023 us 42 ns 10 ns 96 ns kblib::visit2_nop(v, f...), ch 100 38 10.3892 ms 2.839 us 2.836 us 2.845 us 18 ns 9 ns 36 ns std::get_if, ch 100 40 10.584 ms 2.82 us 2.817 us 2.827 us 21 ns 12 ns 40 ns switch (v.index()), ch 100 45 10.539 ms 2.342 us 2.339 us 2.35 us 25 ns 11 ns 46 ns std::function, ex 100 51 10.3734 ms 2.126 us 2.124 us 2.13 us 14 ns 7 ns 24 ns std::visit(v, f), ex 100 16 10.8656 ms 6.765 us 6.762 us 6.774 us 24 ns 6 ns 42 ns kblib::visit(v, f...), ex 100 17 10.9701 ms 6.508 us 6.498 us 6.532 us 77 ns 41 ns 144 ns kblib::visit(v)(f...), ex 100 16 10.7856 ms 6.694 us 6.686 us 6.714 us 58 ns 19 ns 105 ns visit_indexed(v, f...), ex 100 19 10.5602 ms 5.661 us 5.657 us 5.673 us 31 ns 9 ns 67 ns kblib::visit2(v, f...), ex 100 40 10.632 ms 2.768 us 2.763 us 2.773 us 25 ns 21 ns 34 ns Profiling took 106.104 seconds Release, -mtune=native: 105.938 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 127 10.8966 ms 856 ns 855 ns 858 ns 8 ns 5 ns 13 ns raw pointer 100 112 10.8976 ms 970 ns 968 ns 972 ns 9 ns 5 ns 16 ns unique_ptr 100 71 10.9482 ms 1.663 us 1.655 us 1.671 us 40 ns 26 ns 64 ns poly_obj 100 54 11.016 ms 2.013 us 2.007 us 2.024 us 39 ns 23 ns 70 ns std::function 100 38 10.8718 ms 2.826 us 2.816 us 2.84 us 60 ns 49 ns 82 ns std::visit(v, f) 100 18 11.2356 ms 6.39 us 6.349 us 6.468 us 278 ns 164 ns 427 ns kblib::visit(v, f...) 100 15 11.04 ms 7.393 us 7.387 us 7.407 us 44 ns 22 ns 86 ns kblib::visit(v)(f...) 100 17 10.9293 ms 6.448 us 6.433 us 6.483 us 111 ns 60 ns 202 ns visit_indexed(v, f...) 100 20 11.208 ms 5.605 us 5.593 us 5.653 us 106 ns 24 ns 245 ns kblib::visit2(v, f...) 100 51 10.9395 ms 2.247 us 2.218 us 2.281 us 158 ns 135 ns 235 ns kblib::visit2_nop(v, f...) 100 49 10.9613 ms 2.542 us 2.531 us 2.554 us 58 ns 26 ns 104 ns std::get_if 100 57 10.9953 ms 1.888 us 1.885 us 1.894 us 19 ns 6 ns 34 ns switch (v.index()) 100 65 11.011 ms 1.665 us 1.664 us 1.668 us 8 ns 4 ns 15 ns raw pointer, ch 100 78 10.9434 ms 1.401 us 1.399 us 1.404 us 10 ns 6 ns 19 ns unique_ptr, ch 100 52 10.868 ms 2.075 us 2.073 us 2.08 us 15 ns 9 ns 25 ns poly_obj, ch 100 60 10.944 ms 1.81 us 1.808 us 1.812 us 9 ns 6 ns 14 ns std::function, ch 100 42 11.0334 ms 2.649 us 2.646 us 2.656 us 22 ns 11 ns 36 ns kblib::visit2_nop(v, f...), ch 100 41 10.9552 ms 2.698 us 2.687 us 2.728 us 88 ns 40 ns 180 ns std::get_if, ch 100 38 10.925 ms 2.826 us 2.822 us 2.833 us 24 ns 15 ns 36 ns switch (v.index()), ch 100 46 10.9434 ms 2.393 us 2.379 us 2.422 us 98 ns 57 ns 152 ns std::function, ex 100 40 11.12 ms 2.707 us 2.704 us 2.714 us 21 ns 11 ns 34 ns std::visit(v, f), ex 100 19 11.2366 ms 5.94 us 5.897 us 6.038 us 313 ns 161 ns 526 ns kblib::visit(v, f...), ex 100 17 11.3747 ms 6.662 us 6.652 us 6.688 us 76 ns 34 ns 152 ns kblib::visit(v)(f...), ex 100 16 11.264 ms 7.098 us 7.068 us 7.192 us 243 ns 83 ns 535 ns visit_indexed(v, f...), ex 100 22 11.143 ms 5.06 us 5.043 us 5.108 us 135 ns 51 ns 283 ns kblib::visit2(v, f...), ex 100 39 11.0409 ms 2.835 us 2.83 us 2.846 us 37 ns 22 ns 62 ns Profiling took 105.938 seconds Release, generic: 106.594 seconds ------------------------------------------------------------------------------- poly_obj performance ------------------------------------------------------------------------------- ../kblib/variant.cpp:431 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 128 11.2256 ms 864 ns 859 ns 871 ns 28 ns 19 ns 40 ns raw pointer 100 114 11.1606 ms 1.026 us 1.002 us 1.065 us 154 ns 109 ns 212 ns unique_ptr 100 70 11.249 ms 1.652 us 1.63 us 1.678 us 121 ns 91 ns 167 ns poly_obj 100 49 11.3092 ms 2.105 us 2.082 us 2.133 us 127 ns 109 ns 148 ns std::function 100 40 11.364 ms 2.82 us 2.806 us 2.843 us 87 ns 57 ns 127 ns std::visit(v, f) 100 18 11.5326 ms 6.484 us 6.45 us 6.573 us 259 ns 116 ns 534 ns kblib::visit(v, f...) 100 15 11.232 ms 7.423 us 7.404 us 7.457 us 126 ns 83 ns 191 ns kblib::visit(v)(f...) 100 15 11.229 ms 7.432 us 7.414 us 7.476 us 135 ns 67 ns 272 ns visit_indexed(v, f...) 100 20 11.294 ms 5.592 us 5.588 us 5.603 us 33 ns 17 ns 64 ns kblib::visit2(v, f...) 100 51 11.2914 ms 2.099 us 2.092 us 2.109 us 41 ns 23 ns 63 ns kblib::visit2_nop(v, f...) 100 50 11.255 ms 2.542 us 2.536 us 2.545 us 20 ns 8 ns 41 ns std::get_if 100 55 11.1595 ms 1.912 us 1.909 us 1.918 us 19 ns 9 ns 35 ns switch (v.index()) 100 67 11.1555 ms 1.704 us 1.692 us 1.736 us 93 ns 41 ns 182 ns raw pointer, ch 100 80 11.256 ms 1.404 us 1.402 us 1.407 us 10 ns 6 ns 18 ns unique_ptr, ch 100 52 11.18 ms 2.144 us 2.134 us 2.157 us 58 ns 49 ns 85 ns poly_obj, ch 100 62 11.3026 ms 1.816 us 1.814 us 1.819 us 13 ns 10 ns 17 ns std::function, ch 100 43 11.3305 ms 2.645 us 2.64 us 2.653 us 30 ns 19 ns 46 ns kblib::visit2_nop(v, f...), ch 100 37 11.1666 ms 2.798 us 2.768 us 2.857 us 206 ns 121 ns 335 ns std::get_if, ch 100 35 11.1685 ms 2.916 us 2.908 us 2.937 us 63 ns 25 ns 112 ns switch (v.index()), ch 100 47 11.3881 ms 2.389 us 2.383 us 2.402 us 44 ns 26 ns 77 ns std::function, ex 100 42 11.3232 ms 2.71 us 2.69 us 2.748 us 134 ns 78 ns 206 ns std::visit(v, f), ex 100 19 11.4057 ms 5.888 us 5.883 us 5.9 us 38 ns 20 ns 70 ns kblib::visit(v, f...), ex 100 17 11.6178 ms 6.664 us 6.656 us 6.678 us 53 ns 31 ns 83 ns kblib::visit(v)(f...), ex 100 16 11.4176 ms 7.228 us 7.181 us 7.339 us 349 ns 167 ns 638 ns visit_indexed(v, f...), ex 100 22 11.2398 ms 5.206 us 5.177 us 5.3 us 238 ns 56 ns 521 ns kblib::visit2(v, f...), ex 100 40 11.352 ms 2.881 us 2.874 us 2.89 us 40 ns 32 ns 56 ns Profiling took 106.594 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 9 4.743 ms 5.377 us 5.257 us 5.604 us 815 ns 473 ns 1.219 us raw pointer 100 5 5.156 ms 10.47 us 10.331 us 10.772 us 992 ns 506 ns 1.697 us unique_ptr 100 4 4.7136 ms 11.826 us 11.777 us 11.934 us 354 ns 193 ns 629 ns poly_obj 100 4 5.9116 ms 14.644 us 14.606 us 14.745 us 291 ns 131 ns 588 ns std::function 100 3 4.4946 ms 15.247 us 15.185 us 15.464 us 524 ns 141 ns 1.189 us std::visit(v, f) 100 2 5.4606 ms 27.375 us 27.319 us 27.571 us 443 ns 15 ns 1.009 us kblib::visit(v, f...) 100 2 7.1178 ms 37.308 us 37.237 us 37.471 us 519 ns 235 ns 953 ns kblib::visit(v)(f...) 100 2 7.2682 ms 37.253 us 37.132 us 37.49 us 836 ns 495 ns 1.355 us visit_indexed(v, f...) 100 2 6.1444 ms 30.203 us 30.11 us 30.442 us 677 ns 172 ns 1.359 us kblib::visit2(v, f...) 100 6 5.073 ms 8.407 us 8.401 us 8.423 us 46 ns 11 ns 83 ns kblib::visit2_nop(v, f...) 100 6 5.2518 ms 8.65 us 8.624 us 8.724 us 198 ns 55 ns 422 ns std::get_if 100 6 5.2548 ms 8.58 us 8.571 us 8.604 us 68 ns 11 ns 125 ns switch (v.index()) 100 5 4.53 ms 8.984 us 8.976 us 9.003 us 55 ns 9 ns 100 ns raw pointer, ch 100 3 4.608 ms 15.859 us 15.732 us 16.168 us 953 ns 495 ns 1.945 us unique_ptr, ch 100 3 5.4471 ms 18.344 us 18.185 us 18.621 us 1.049 us 681 ns 1.495 us poly_obj, ch 100 3 5.4147 ms 18.29 us 18.154 us 18.501 us 847 ns 605 ns 1.123 us std::function, ch 100 2 4.9736 ms 25.2 us 25.049 us 25.751 us 1.255 us 163 ns 2.845 us kblib::visit2_nop(v, f...), ch 100 4 4.9792 ms 12.327 us 12.257 us 12.558 us 575 ns 199 ns 1.274 us std::get_if, ch 100 4 5.0184 ms 12.386 us 12.371 us 12.42 us 107 ns 35 ns 189 ns switch (v.index()), ch 100 3 5.2515 ms 16.817 us 16.787 us 16.853 us 166 ns 137 ns 229 ns std::function, ex 100 2 4.7588 ms 23.758 us 23.665 us 23.951 us 654 ns 373 ns 1.115 us std::visit(v, f), ex 100 2 8.1426 ms 40.646 us 40.478 us 40.916 us 1.065 us 739 ns 1.445 us kblib::visit(v, f...), ex 100 1 4.5847 ms 44.016 us 43.855 us 44.341 us 1.114 us 639 ns 1.733 us kblib::visit(v)(f...), ex 100 1 4.8752 ms 46.345 us 46.078 us 47.004 us 1.974 us 680 ns 3.551 us visit_indexed(v, f...), ex 100 2 8.0456 ms 40.066 us 39.853 us 40.526 us 1.52 us 869 ns 2.835 us kblib::visit2(v, f...), ex 100 4 4.9984 ms 12.353 us 12.318 us 12.426 us 245 ns 128 ns 403 ns Profiling took 79.9745 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 6 22.3692 ms 37.549 us 37.463 us 37.684 us 539 ns 382 ns 750 ns raw pointer 100 5 25.0175 ms 51.205 us 50.874 us 51.771 us 2.15 us 1.486 us 3.603 us unique_ptr 100 4 27.8304 ms 70.346 us 70.156 us 70.684 us 1.262 us 816 ns 1.924 us poly_obj 100 3 23.6682 ms 79.075 us 78.949 us 79.336 us 886 ns 520 ns 1.625 us std::function 100 3 31.8021 ms 106.562 us 106.382 us 106.841 us 1.129 us 836 ns 1.618 us std::visit(v, f) 100 1 23.5644 ms 238.055 us 237.817 us 238.509 us 1.626 us 1 us 2.622 us kblib::visit(v, f...) 100 1 25.7574 ms 258.965 us 258.066 us 260.366 us 5.637 us 4.066 us 8.166 us kblib::visit(v)(f...) 100 1 28.5982 ms 288.355 us 288.059 us 288.93 us 2.025 us 1.262 us 3.524 us visit_indexed(v, f...) 100 2 42.2564 ms 208.894 us 208.644 us 209.314 us 1.62 us 1.085 us 2.408 us kblib::visit2(v, f...) 100 2 42.043 ms 211.649 us 210.64 us 214.749 us 8.266 us 3.281 us 18.263 us kblib::visit2_nop(v, f...) 100 1 22.4208 ms 222.502 us 221.938 us 223.046 us 2.814 us 2.477 us 3.237 us std::get_if 100 2 31.1868 ms 158.164 us 157.007 us 160.526 us 8.067 us 4.725 us 14.666 us switch (v.index()) 100 2 31.8476 ms 160.739 us 159.819 us 162.011 us 5.483 us 4.228 us 6.857 us raw pointer, ch 100 4 22.7368 ms 56.917 us 56.429 us 58.236 us 3.801 us 1.717 us 8.02 us unique_ptr, ch 100 3 31.3869 ms 108.046 us 107.507 us 109.231 us 3.883 us 1.865 us 6.907 us poly_obj, ch 100 3 28.8066 ms 96.128 us 96.011 us 96.313 us 739 ns 526 ns 1.058 us std::function, ch 100 2 24.474 ms 122.038 us 121.671 us 122.737 us 2.51 us 1.494 us 3.997 us kblib::visit2_nop(v, f...), ch 100 1 31.7631 ms 322.764 us 318.6 us 329.289 us 26.09 us 18.561 us 35.949 us std::get_if, ch 100 1 23.0951 ms 232.006 us 231.733 us 232.347 us 1.543 us 1.221 us 2.061 us switch (v.index()), ch 100 2 39.7608 ms 203.752 us 201.604 us 211.332 us 18.226 us 4.429 us 41.284 us std::function, ex 100 2 25.1966 ms 126.152 us 126.051 us 126.364 us 715 ns 408 ns 1.27 us std::visit(v, f)), ex 100 1 31.1489 ms 310.9 us 310.401 us 311.57 us 2.921 us 2.349 us 3.567 us kblib::visit(v, f...), ex 100 1 32.8602 ms 328.484 us 327.863 us 329.82 us 4.41 us 2.399 us 7.407 us kblib::visit(v)(f...), ex 100 1 37.4233 ms 377.681 us 372.931 us 386.452 us 31.852 us 19.155 us 46.567 us visit_indexed(v, f...), ex 100 1 26.1303 ms 261.261 us 260.765 us 262.084 us 3.206 us 2.318 us 5.439 us kblib::visit2(v, f...), ex 100 1 31.4924 ms 315.509 us 314.922 us 316.366 us 3.585 us 2.645 us 5.292 us Profiling took 285.908 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 9 4.635 ms 5.138 us 5.129 us 5.178 us 83 ns 13 ns 196 ns raw pointer 100 5 5.1715 ms 10.635 us 10.437 us 11.007 us 1.342 us 786 ns 2.038 us unique pointer 100 4 4.7528 ms 11.9 us 11.835 us 12.031 us 447 ns 249 ns 715 ns poly_obj 100 3 4.6473 ms 20.512 us 19.284 us 22.214 us 7.303 us 5.666 us 8.991 us std::function 100 4 4.8512 ms 11.993 us 11.942 us 12.115 us 375 ns 135 ns 659 ns std::variant (std::visit) 100 2 6.1792 ms 30.782 us 30.759 us 30.837 us 180 ns 93 ns 296 ns kblib::visit(v, f...) 100 2 7.6762 ms 39.302 us 39.049 us 39.82 us 1.769 us 1.024 us 2.984 us kblib::visit(v)(f...) 100 2 7.1928 ms 35.995 us 35.919 us 36.176 us 564 ns 280 ns 1.057 us visit_indexed(v,f...) 100 2 6.3282 ms 31.176 us 31.084 us 31.331 us 595 ns 411 ns 1.061 us kblib::visit2(v, f...) 100 6 4.8774 ms 8.14 us 8.119 us 8.215 us 177 ns 44 ns 405 ns kblib::visit2_nop(v, f...) 100 6 5.2134 ms 8.669 us 8.633 us 8.777 us 287 ns 105 ns 624 ns variant (get_if) 100 6 5.1192 ms 8.479 us 8.462 us 8.523 us 129 ns 64 ns 247 ns variant (switch) 100 5 4.764 ms 8.94 us 8.899 us 9.04 us 302 ns 117 ns 554 ns raw pointer, ch 100 4 5.7096 ms 14.695 us 14.483 us 15.123 us 1.481 us 768 ns 2.452 us unique pointer, ch 100 3 5.0517 ms 17.029 us 16.837 us 17.441 us 1.372 us 760 ns 2.484 us poly_obj, ch 100 3 5.1144 ms 17.07 us 17.055 us 17.125 us 129 ns 32 ns 298 ns std::function, ch 100 3 5.5131 ms 18.569 us 18.421 us 18.777 us 879 ns 680 ns 1.133 us std::function, ex 100 3 4.8792 ms 16.258 us 16.166 us 16.444 us 652 ns 401 ns 1.074 us std::variant (std::visit), ex 100 2 5.665 ms 28.49 us 28.442 us 28.611 us 359 ns 137 ns 707 ns kblib::visit(v, f...), ex 100 1 4.7651 ms 37.982 us 36.809 us 40.261 us 7.962 us 4.423 us 11.969 us kblib::visit(v)(f...), ex 100 2 7.2316 ms 35.708 us 35.682 us 35.773 us 183 ns 14 ns 332 ns visit_indexed(v,f...), ex 100 2 6.1152 ms 29.788 us 29.758 us 29.864 us 220 ns 67 ns 393 ns kblib::visit2(v, f...), ex 100 4 5.558 ms 9.207 us 9.12 us 9.384 us 604 ns 328 ns 993 ns kblib::visit2_nop(v, f...), ch 100 5 4.8215 ms 9.588 us 9.504 us 9.774 us 608 ns 326 ns 995 ns variant (get_if), ch 100 5 4.7045 ms 9.305 us 9.284 us 9.348 us 148 ns 82 ns 235 ns variant (switch), ch 100 4 5.3092 ms 13.795 us 13.557 us 14.112 us 1.396 us 1.108 us 1.737 us Profiling took 80.1834 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 6 22.3044 ms 37.64 us 37.416 us 38.071 us 1.531 us 888 ns 2.415 us raw pointer 100 5 24.932 ms 51.156 us 50.755 us 52.043 us 2.902 us 1.648 us 5.853 us unique pointer 100 4 27.8948 ms 69.79 us 69.58 us 70.197 us 1.437 us 913 ns 2.661 us poly_obj 100 3 23.6661 ms 80.864 us 80.012 us 82.42 us 5.717 us 3.534 us 8.539 us std::function 100 3 31.812 ms 106.142 us 105.704 us 106.86 us 2.801 us 1.909 us 3.982 us std::variant (std::visit) 100 1 24.4091 ms 341.306 us 325.722 us 356.802 us 79.367 us 72.708 us 88.831 us kblib::visit(v, f...) 100 1 27.5098 ms 281.259 us 278.748 us 285.102 us 15.584 us 11.157 us 26.825 us kblib::visit(v)(f...) 100 1 29.8849 ms 300.405 us 299.205 us 302.798 us 8.357 us 5.102 us 14.674 us visit_indexed(v,f...) 100 2 40.9656 ms 210.013 us 207.359 us 215.255 us 18.187 us 10.902 us 28.677 us kblib::visit2(v, f...) 100 2 42.6954 ms 212.36 us 212.081 us 212.641 us 1.43 us 1.232 us 1.694 us kblib::visit2_nop(v, f...) 100 2 43.8636 ms 222.103 us 220.798 us 227.05 us 11.582 us 2.463 us 27.032 us variant (get_if) 100 2 31.8722 ms 159.64 us 158.807 us 160.813 us 5.012 us 3.862 us 7.174 us variant (switch) 100 2 31.9002 ms 158.96 us 158.391 us 159.89 us 3.642 us 2.528 us 5.44 us raw pointer, ch 100 5 26.67 ms 53.673 us 53.508 us 54.077 us 1.23 us 639 ns 2.416 us unique pointer, ch 100 3 31.7316 ms 106.701 us 105.933 us 108.792 us 5.867 us 1.361 us 12.124 us poly_obj, ch 100 3 27.0762 ms 90.905 us 90.594 us 91.491 us 2.109 us 1.347 us 3.628 us std::function, ch 100 3 30.3408 ms 101.139 us 100.835 us 101.658 us 1.979 us 1.302 us 2.935 us std::function, ex 100 3 30.18 ms 101.033 us 100.619 us 101.843 us 2.845 us 1.712 us 4.762 us std::variant (std::visit), ex 100 1 25.4796 ms 255.501 us 253.653 us 259.863 us 13.656 us 7.234 us 27.57 us kblib::visit(v, f...), ex 100 1 25.545 ms 263.11 us 261.301 us 264.921 us 9.245 us 8.9 us 9.838 us kblib::visit(v)(f...), ex 100 1 28.2635 ms 294.275 us 289.117 us 303.389 us 33.889 us 21.521 us 49.371 us visit_indexed(v,f...), ex 100 2 41.4532 ms 207.312 us 206.379 us 209.973 us 7.322 us 3.043 us 15.497 us kblib::visit2(v, f...), ex 100 1 23.9571 ms 239.969 us 238.943 us 242.059 us 7.167 us 4.081 us 11.696 us kblib::visit2_nop(v, f...), ex 100 1 24.1111 ms 241.987 us 241.664 us 242.477 us 1.999 us 1.477 us 3.024 us variant (get_if), ex 100 2 35.33 ms 176.568 us 175.984 us 177.706 us 4.003 us 2.48 us 7.096 us variant (switch), ex 100 2 31.9386 ms 158.344 us 157.896 us 158.98 us 2.68 us 2.077 us 3.747 us Profiling took 274.621 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 11 4.7938 ms 4.38 us 4.351 us 4.472 us 231 ns 78 ns 507 ns raw pointer 100 8 5.0472 ms 6.331 us 6.315 us 6.369 us 117 ns 60 ns 225 ns kblib::visit2_nop(v, f...) 100 6 4.7262 ms 7.677 us 7.669 us 7.699 us 59 ns 9 ns 108 ns unique pointer 100 6 4.9116 ms 7.906 us 7.82 us 8.112 us 634 ns 225 ns 1.119 us kblib::visit2(v, f...) 100 6 4.7616 ms 8.026 us 7.927 us 8.231 us 701 ns 415 ns 1.24 us variant (get_if) 100 6 4.8822 ms 8.14 us 8.131 us 8.161 us 60 ns 4 ns 112 ns poly_obj 100 6 5.0676 ms 8.451 us 8.419 us 8.514 us 219 ns 122 ns 342 ns variant (switch) 100 4 4.9284 ms 11.754 us 11.665 us 11.875 us 529 ns 414 ns 691 ns std::function 100 3 6.5157 ms 21.735 us 21.694 us 21.85 us 316 ns 103 ns 653 ns std::variant (std::visit) 100 2 5.2906 ms 26.333 us 26.256 us 26.53 us 586 ns 275 ns 1.147 us visit_indexed(v,f...) 100 2 5.862 ms 29.565 us 29.496 us 29.692 us 465 ns 304 ns 866 ns kblib::visit(v, f...) 100 2 7.1006 ms 34.45 us 34.38 us 34.58 us 472 ns 299 ns 823 ns kblib::visit(v)(f...) 100 2 7.9008 ms 38.245 us 38.078 us 38.555 us 1.132 us 708 ns 1.71 us Profiling took 39.661 seconds benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 6 4.4124 ms 5.223 us 5.191 us 5.377 us 309 ns 14 ns 737 ns raw pointer 100 5 5.2525 ms 10.479 us 10.434 us 10.568 us 308 ns 179 ns 511 ns variant (get_if) 100 4 4.6808 ms 11.518 us 11.503 us 11.566 us 120 ns 27 ns 262 ns unique pointer 100 4 4.7656 ms 12.006 us 11.946 us 12.114 us 397 ns 251 ns 596 ns kblib::visit2_nop(v, f...) 100 4 4.9788 ms 12.387 us 12.302 us 12.582 us 623 ns 244 ns 1.084 us poly_obj 100 4 4.9752 ms 12.56 us 12.443 us 12.786 us 800 ns 483 ns 1.277 us variant (switch) 100 4 5.6 ms 14.04 us 13.977 us 14.161 us 430 ns 257 ns 685 ns kblib::visit2(v, f...) 100 3 4.9467 ms 16.059 us 16.035 us 16.135 us 185 ns 5 ns 415 ns std::function 100 3 5.4135 ms 18.282 us 18.176 us 18.496 us 737 ns 411 ns 1.215 us std::variant (std::visit) 100 2 8.19 ms 41.184 us 41.12 us 41.308 us 438 ns 256 ns 733 ns visit_indexed(v,f...) 100 2 8.403 ms 42.434 us 42.364 us 42.523 us 399 ns 232 ns 626 ns kblib::visit(v)(f...) 100 1 4.86 ms 47.994 us 47.913 us 48.215 us 599 ns 49 ns 1.254 us kblib::visit(v, f...) 100 1 4.747 ms 49.211 us 48.647 us 50.267 us 3.818 us 2.31 us 5.858 us Profiling took 41.8537 seconds 3295065912 != 3795016604 ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 7 26.2248 ms 38.719 us 37.608 us 44.007 us 10.602 us 678 ns 25.253 us raw pointer 100 5 25.0545 ms 51.265 us 50.892 us 52.325 us 2.946 us 1.259 us 6.352 us unique pointer 100 4 28.1292 ms 70.737 us 70.338 us 71.408 us 2.576 us 1.706 us 3.614 us poly_obj 100 3 25.7268 ms 84.821 us 84.451 us 85.445 us 2.389 us 1.587 us 3.358 us std::function 100 3 30.5532 ms 102.861 us 102.441 us 103.516 us 2.619 us 1.846 us 3.734 us std::variant (std::visit) 100 1 23.9894 ms 239.995 us 239.639 us 240.658 us 2.416 us 1.468 us 3.84 us kblib::visit(v, f...) 100 1 25.7096 ms 257.245 us 256.896 us 257.899 us 2.374 us 1.425 us 3.769 us kblib::visit(v)(f...) 100 1 29.439 ms 283.741 us 282.929 us 284.904 us 4.924 us 3.737 us 6.403 us visit_indexed(v,f...) 100 2 41.4114 ms 207.239 us 206.314 us 208.565 us 5.603 us 4.318 us 7.281 us kblib::visit2(v, f...) 100 2 42.849 ms 212.849 us 212.046 us 213.682 us 4.185 us 3.759 us 4.879 us kblib::visit2_nop(v, f...) 100 2 44.7278 ms 219.521 us 218.959 us 220.084 us 2.867 us 2.584 us 3.206 us variant (get_if) 100 2 31.96 ms 158.312 us 157.847 us 158.894 us 2.637 us 2.171 us 3.5 us variant (switch) 100 2 32.155 ms 159.906 us 159.53 us 160.349 us 2.075 us 1.722 us 2.818 us std::function, ex 100 3 30.4173 ms 101.333 us 101.231 us 101.501 us 651 ns 445 ns 963 ns std::function, ch 100 3 30.4224 ms 101.977 us 101.722 us 102.46 us 1.725 us 1.091 us 2.889 us std::variant (std::visit), ex 100 1 26.8135 ms 264.95 us 260.861 us 271.557 us 26.131 us 18.018 us 38.239 us kblib::visit(v, f...), ex 100 1 26.9409 ms 270.371 us 269.997 us 271.011 us 2.444 us 1.635 us 3.536 us kblib::visit(v)(f...), ex 100 1 29.9595 ms 291.102 us 290.506 us 292.61 us 4.506 us 2.239 us 9.217 us visit_indexed(v,f...), ex 100 2 42.5894 ms 212.549 us 211.301 us 214.526 us 7.899 us 5.691 us 11.447 us kblib::visit2(v, f...), ex 100 1 24.2211 ms 244.395 us 242.628 us 247.837 us 12.133 us 7.055 us 19.444 us kblib::visit2_nop(v, f...), ex 100 1 24.8372 ms 246.955 us 246.657 us 247.338 us 1.714 us 1.375 us 2.192 us variant (get_if), ex 100 2 36.5726 ms 182.956 us 182.565 us 183.63 us 2.55 us 1.663 us 4.081 us variant (switch), ex 100 2 31.7458 ms 158.221 us 157.414 us 159.31 us 4.743 us 3.761 us 6.108 us Profiling took 259.889 seconds ............................................................................... benchmark name samples iterations estimated mean low mean high mean std dev low std dev high std dev ------------------------------------------------------------------------------- baseline 100 9 4.7961 ms 5.115 us 5.1 us 5.18 us 131 ns 14 ns 312 ns raw pointer 100 6 4.5822 ms 7.283 us 7.274 us 7.305 us 68 ns 27 ns 118 ns unique pointer 100 6 5.2782 ms 8.895 us 8.819 us 9.19 us 666 ns 152 ns 1.531 us poly_obj 100 5 4.4595 ms 8.888 us 8.842 us 9.016 us 351 ns 142 ns 735 ns std::function 100 4 4.818 ms 12.745 us 12.361 us 13.426 us 2.538 us 1.648 us 3.822 us std::variant (std::visit) 100 2 5.5498 ms 27.845 us 27.653 us 28.22 us 1.328 us 828 ns 2.48 us kblib::visit(v, f...) 100 2 8.3106 ms 42.736 us 42.35 us 43.285 us 2.309 us 1.777 us 2.924 us kblib::visit(v)(f...) 100 2 7.2712 ms 36.864 us 36.815 us 36.999 us 375 ns 155 ns 756 ns visit_indexed(v,f...) 100 2 6.2024 ms 31.206 us 30.712 us 32.007 us 3.138 us 2.159 us 4.735 us kblib::visit2(v, f...) 100 6 4.8558 ms 8.105 us 8.052 us 8.293 us 432 ns 36 ns 977 ns kblib::visit2_nop(v, f...) 100 6 5.2914 ms 8.705 us 8.64 us 8.922 us 533 ns 131 ns 1.189 us variant (get_if) 100 6 5.1576 ms 8.468 us 8.447 us 8.527 us 156 ns 39 ns 334 ns variant (switch) 100 5 4.625 ms 8.962 us 8.947 us 9.005 us 117 ns 34 ns 242 ns std::function, ex 100 3 4.7481 ms 15.997 us 15.941 us 16.144 us 430 ns 171 ns 880 ns std::function, ch 100 3 5.0562 ms 16.66 us 16.627 us 16.764 us 251 ns 20 ns 555 ns std::variant (std::visit), ex 100 2 5.754 ms 28.514 us 28.458 us 28.721 us 481 ns 126 ns 1.096 us kblib::visit(v, f...), ex 100 2 7.278 ms 36.643 us 36.535 us 36.972 us 859 ns 312 ns 1.867 us kblib::visit(v)(f...), ex 100 2 7.2594 ms 36.935 us 36.88 us 37.08 us 421 ns 190 ns 881 ns visit_indexed(v,f...), ex 100 2 5.9672 ms 30.009 us 29.861 us 30.606 us 1.261 us 100 ns 2.917 us kblib::visit2(v, f...), ex 100 5 4.5125 ms 9.04 us 8.972 us 9.221 us 520 ns 203 ns 1.057 us kblib::visit2_nop(v, f...), ex 100 5 4.601 ms 9.142 us 9.076 us 9.278 us 463 ns 277 ns 827 ns variant (get_if), ex 100 5 4.498 ms 8.871 us 8.861 us 8.898 us 75 ns 12 ns 138 ns variant (switch), ex 100 4 5.076 ms 12.624 us 12.544 us 12.757 us 514 ns 365 ns 815 ns Profiling took 70.3751 seconds