Skip to content

Instantly share code, notes, and snippets.

@tsafin
Last active August 15, 2021 20:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsafin/618fbf847d258f6e7f5a75fdf9ea945b to your computer and use it in GitHub Desktop.
Save tsafin/618fbf847d258f6e7f5a75fdf9ea945b to your computer and use it in GitHub Desktop.

Datetime benchmark: selecting double vs int64_t

It was told that if field datetime.secs would be double we should get better performance in LuaJIT instead of uint64_t type used at the moment.

So we have created benchmark, which was comparing implementations of functions from datetime.c if we would use double or int64_t for datetime.secs field.

I used mobile Whiskeylake processor (i7-8565U) for running benchmarks.

SSE2 results

This is default mode, which is activated if there is no extra flag provided in the command line:

22:18 $ ./perf/datetime.perftest --benchmark_repetitions=5
2021-08-15 22:18:19
Running ./perf/datetime.perftest
Run on (8 X 1992.01 MHz CPU s)
CPU Caches:
  L1 Data 32K (x4)
  L1 Instruction 32K (x4)
  L2 Unified 256K (x4)
  L3 Unified 8192K (x1)
***WARNING*** Library was built as DEBUG. Timings may be affected.
---------------------------------------------------------------------------------
Benchmark                                          Time           CPU Iterations
---------------------------------------------------------------------------------
CDT_Parse70                                     3372 ns       3372 ns     221484
CDT_Parse70                                     4766 ns       4766 ns     221484
CDT_Parse70                                     4828 ns       4828 ns     221484
CDT_Parse70                                     4841 ns       4841 ns     221484
CDT_Parse70                                     5616 ns       5616 ns     221484
CDT_Parse70_mean                                4685 ns       4685 ns     221484
CDT_Parse70_median                              4828 ns       4828 ns     221484
CDT_Parse70_stddev                               813 ns        813 ns     221484
CDT_Parse1                                        66 ns         66 ns    9659636
CDT_Parse1                                        62 ns         62 ns    9659636
CDT_Parse1                                        66 ns         66 ns    9659636
CDT_Parse1                                        76 ns         76 ns    9659636
CDT_Parse1                                        85 ns         85 ns    9659636
CDT_Parse1_mean                                   71 ns         71 ns    9659636
CDT_Parse1_median                                 66 ns         66 ns    9659636
CDT_Parse1_stddev                                  9 ns          9 ns    9659636
DateTime_Assign70<uint64_t>                     6396 ns       6396 ns     113543
DateTime_Assign70<uint64_t>                     5979 ns       5980 ns     113543
DateTime_Assign70<uint64_t>                     5254 ns       5254 ns     113543
DateTime_Assign70<uint64_t>                     4605 ns       4605 ns     113543
DateTime_Assign70<uint64_t>                     4416 ns       4416 ns     113543
DateTime_Assign70<uint64_t>_mean                5330 ns       5330 ns     113543
DateTime_Assign70<uint64_t>_median              5254 ns       5254 ns     113543
DateTime_Assign70<uint64_t>_stddev               855 ns        855 ns     113543
DateTime_Assign70<double>                       5063 ns       5063 ns     144252
DateTime_Assign70<double>                       4753 ns       4753 ns     144252
DateTime_Assign70<double>                       4625 ns       4625 ns     144252
DateTime_Assign70<double>                       4869 ns       4869 ns     144252
DateTime_Assign70<double>                       4623 ns       4623 ns     144252
DateTime_Assign70<double>_mean                  4787 ns       4787 ns     144252
DateTime_Assign70<double>_median                4753 ns       4753 ns     144252
DateTime_Assign70<double>_stddev                 185 ns        185 ns     144252
DateTime_AssignCompare70<uint64_t>              4948 ns       4948 ns     138962
DateTime_AssignCompare70<uint64_t>              4741 ns       4741 ns     138962
DateTime_AssignCompare70<uint64_t>              4969 ns       4969 ns     138962
DateTime_AssignCompare70<uint64_t>              5011 ns       5011 ns     138962
DateTime_AssignCompare70<uint64_t>              4790 ns       4790 ns     138962
DateTime_AssignCompare70<uint64_t>_mean         4892 ns       4892 ns     138962
DateTime_AssignCompare70<uint64_t>_median       4948 ns       4948 ns     138962
DateTime_AssignCompare70<uint64_t>_stddev        119 ns        119 ns     138962
DateTime_AssignCompare70<double>                4597 ns       4597 ns     146682
DateTime_AssignCompare70<double>                4784 ns       4784 ns     146682
DateTime_AssignCompare70<double>                4725 ns       4725 ns     146682
DateTime_AssignCompare70<double>                5064 ns       5064 ns     146682
DateTime_AssignCompare70<double>                5067 ns       5067 ns     146682
DateTime_AssignCompare70<double>_mean           4847 ns       4848 ns     146682
DateTime_AssignCompare70<double>_median         4784 ns       4784 ns     146682
DateTime_AssignCompare70<double>_stddev          210 ns        210 ns     146682
DateTime_Compare20<uint64_t>                       3 ns          3 ns  200467914
DateTime_Compare20<uint64_t>                       3 ns          3 ns  200467914
DateTime_Compare20<uint64_t>                       4 ns          4 ns  200467914
DateTime_Compare20<uint64_t>                       4 ns          4 ns  200467914
DateTime_Compare20<uint64_t>                       4 ns          4 ns  200467914
DateTime_Compare20<uint64_t>_mean                  3 ns          3 ns  200467914
DateTime_Compare20<uint64_t>_median                4 ns          4 ns  200467914
DateTime_Compare20<uint64_t>_stddev                0 ns          0 ns  200467914
DateTime_Compare20<double>                         4 ns          4 ns  183118656
DateTime_Compare20<double>                         4 ns          4 ns  183118656
DateTime_Compare20<double>                         3 ns          3 ns  183118656
DateTime_Compare20<double>                         3 ns          3 ns  183118656
DateTime_Compare20<double>                         3 ns          3 ns  183118656
DateTime_Compare20<double>_mean                    4 ns          4 ns  183118656
DateTime_Compare20<double>_median                  3 ns          3 ns  183118656
DateTime_Compare20<double>_stddev                  0 ns          0 ns  183118656
DateTime_ToString1<uint64_t>                     468 ns        468 ns    1546964
DateTime_ToString1<uint64_t>                     521 ns        521 ns    1546964
DateTime_ToString1<uint64_t>                     524 ns        524 ns    1546964
DateTime_ToString1<uint64_t>                     507 ns        507 ns    1546964
DateTime_ToString1<uint64_t>                     515 ns        515 ns    1546964
DateTime_ToString1<uint64_t>_mean                507 ns        507 ns    1546964
DateTime_ToString1<uint64_t>_median              515 ns        515 ns    1546964
DateTime_ToString1<uint64_t>_stddev               23 ns         23 ns    1546964
DateTime_ToString1<double>                       533 ns        533 ns    1170153
DateTime_ToString1<double>                       514 ns        514 ns    1170153
DateTime_ToString1<double>                       506 ns        506 ns    1170153
DateTime_ToString1<double>                       554 ns        554 ns    1170153
DateTime_ToString1<double>                       522 ns        522 ns    1170153
DateTime_ToString1<double>_mean                  526 ns        526 ns    1170153
DateTime_ToString1<double>_median                522 ns        522 ns    1170153
DateTime_ToString1<double>_stddev                 19 ns         19 ns    1170153

Test Name Median slower/faster
DateTime_Assign70<uint64_t> 5254 ns -
DateTime_Assign70<double> 4948 ns +
DateTime_AssignCompare70<uint64_t> 4948 ns -
DateTime_AssignCompare70<double> 4784 ns +
DateTime_Compare20<uint64_t> 4 ns -
DateTime_Compare20<double> 3 ns +
DateTime_ToString1<uint64_t> 515 ns +
DateTime_ToString1<double> 522 ns -

AVX1

CC=clang-11 CXX=clang++-11 cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DENABLE_AVX=1

22:48 $ ./perf/datetime.perftest --benchmark_repetitions=5
2021-08-15 22:51:05
Running ./perf/datetime.perftest
Run on (8 X 1992.01 MHz CPU s)
CPU Caches:
  L1 Data 32K (x4)
  L1 Instruction 32K (x4)
  L2 Unified 256K (x4)
  L3 Unified 8192K (x1)
***WARNING*** Library was built as DEBUG. Timings may be affected.
---------------------------------------------------------------------------------
Benchmark                                          Time           CPU Iterations
---------------------------------------------------------------------------------
CDT_Parse70                                     5318 ns       5318 ns     146994
CDT_Parse70                                     5131 ns       5131 ns     146994
CDT_Parse70                                     4800 ns       4800 ns     146994
CDT_Parse70                                     4969 ns       4969 ns     146994
CDT_Parse70                                     4746 ns       4746 ns     146994
CDT_Parse70_mean                                4993 ns       4993 ns     146994
CDT_Parse70_median                              4969 ns       4969 ns     146994
CDT_Parse70_stddev                               236 ns        236 ns     146994
CDT_Parse1                                        66 ns         66 ns   11605610
CDT_Parse1                                        83 ns         83 ns   11605610
CDT_Parse1                                        73 ns         73 ns   11605610
CDT_Parse1                                        67 ns         67 ns   11605610
CDT_Parse1                                        69 ns         69 ns   11605610
CDT_Parse1_mean                                   72 ns         72 ns   11605610
CDT_Parse1_median                                 69 ns         69 ns   11605610
CDT_Parse1_stddev                                  7 ns          7 ns   11605610
DateTime_Assign70<uint64_t>                     4740 ns       4740 ns     137220
DateTime_Assign70<uint64_t>                     4651 ns       4651 ns     137220
DateTime_Assign70<uint64_t>                     4380 ns       4380 ns     137220
DateTime_Assign70<uint64_t>                     5384 ns       5384 ns     137220
DateTime_Assign70<uint64_t>                     4837 ns       4837 ns     137220
DateTime_Assign70<uint64_t>_mean                4799 ns       4799 ns     137220
DateTime_Assign70<uint64_t>_median              4740 ns       4740 ns     137220
DateTime_Assign70<uint64_t>_stddev               369 ns        369 ns     137220
DateTime_Assign70<double>                       5326 ns       5326 ns     150722
DateTime_Assign70<double>                       5058 ns       5058 ns     150722
DateTime_Assign70<double>                       4789 ns       4789 ns     150722
DateTime_Assign70<double>                       4724 ns       4724 ns     150722
DateTime_Assign70<double>                       4823 ns       4823 ns     150722
DateTime_Assign70<double>_mean                  4944 ns       4944 ns     150722
DateTime_Assign70<double>_median                4823 ns       4823 ns     150722
DateTime_Assign70<double>_stddev                 248 ns        248 ns     150722
DateTime_AssignCompare70<uint64_t>              4991 ns       4991 ns     137254
DateTime_AssignCompare70<uint64_t>              5257 ns       5257 ns     137254
DateTime_AssignCompare70<uint64_t>              6330 ns       6330 ns     137254
DateTime_AssignCompare70<uint64_t>              6100 ns       6100 ns     137254
DateTime_AssignCompare70<uint64_t>              5367 ns       5367 ns     137254
DateTime_AssignCompare70<uint64_t>_mean         5609 ns       5609 ns     137254
DateTime_AssignCompare70<uint64_t>_median       5367 ns       5367 ns     137254
DateTime_AssignCompare70<uint64_t>_stddev        576 ns        576 ns     137254
DateTime_AssignCompare70<double>                4893 ns       4893 ns     126995
DateTime_AssignCompare70<double>                4932 ns       4932 ns     126995
DateTime_AssignCompare70<double>                5305 ns       5305 ns     126995
DateTime_AssignCompare70<double>                5882 ns       5882 ns     126995
DateTime_AssignCompare70<double>                5998 ns       5998 ns     126995
DateTime_AssignCompare70<double>_mean           5402 ns       5402 ns     126995
DateTime_AssignCompare70<double>_median         5305 ns       5305 ns     126995
DateTime_AssignCompare70<double>_stddev          519 ns        519 ns     126995
DateTime_Compare20<uint64_t>                       4 ns          4 ns  163244713
DateTime_Compare20<uint64_t>                       3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>                       3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>                       3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>                       3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>_mean                  3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>_median                3 ns          3 ns  163244713
DateTime_Compare20<uint64_t>_stddev                0 ns          0 ns  163244713
DateTime_Compare20<double>                         3 ns          3 ns  218120602
DateTime_Compare20<double>                         3 ns          3 ns  218120602
DateTime_Compare20<double>                         3 ns          3 ns  218120602
DateTime_Compare20<double>                         3 ns          3 ns  218120602
DateTime_Compare20<double>                         3 ns          3 ns  218120602
DateTime_Compare20<double>_mean                    3 ns          3 ns  218120602
DateTime_Compare20<double>_median                  3 ns          3 ns  218120602
DateTime_Compare20<double>_stddev                  0 ns          0 ns  218120602
DateTime_ToString1<uint64_t>                     465 ns        465 ns    1732461
DateTime_ToString1<uint64_t>                     494 ns        494 ns    1732461
DateTime_ToString1<uint64_t>                     466 ns        466 ns    1732461
DateTime_ToString1<uint64_t>                     441 ns        441 ns    1732461
DateTime_ToString1<uint64_t>                     456 ns        456 ns    1732461
DateTime_ToString1<uint64_t>_mean                464 ns        464 ns    1732461
DateTime_ToString1<uint64_t>_median              465 ns        465 ns    1732461
DateTime_ToString1<uint64_t>_stddev               19 ns         19 ns    1732461
DateTime_ToString1<double>                       519 ns        519 ns    1360703
DateTime_ToString1<double>                       518 ns        518 ns    1360703
DateTime_ToString1<double>                       531 ns        531 ns    1360703
DateTime_ToString1<double>                       479 ns        479 ns    1360703
DateTime_ToString1<double>                       482 ns        482 ns    1360703
DateTime_ToString1<double>_mean                  506 ns        506 ns    1360703
DateTime_ToString1<double>_median                518 ns        518 ns    1360703
DateTime_ToString1<double>_stddev                 24 ns         24 ns    1360703
Test Name Median slower/faster
DateTime_Assign70<uint64_t> 4740 ns +
DateTime_Assign70<double> 4823 ns -
DateTime_AssignCompare70<uint64_t> 5367 ns -
DateTime_AssignCompare70<double> 5305 ns +
DateTime_Compare20<uint64_t> 3 ns -
DateTime_Compare20<double> 3 ns +
DateTime_ToString1<uint64_t> 465 ns +
DateTime_ToString1<double> 518 ns -

AVX2

CC=clang-11 CXX=clang++-11 cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DENABLE_AVX2=1

AVX2 flags is not yet existing in current cmake - we have established it specifically for the purposes of this benchmark

23:07 $ ./perf/datetime.perftest --benchmark_repetitions=5
2021-08-15 23:08:09
Running ./perf/datetime.perftest
Run on (8 X 1992.01 MHz CPU s)
CPU Caches:
  L1 Data 32K (x4)
  L1 Instruction 32K (x4)
  L2 Unified 256K (x4)
  L3 Unified 8192K (x1)
***WARNING*** Library was built as DEBUG. Timings may be affected.
---------------------------------------------------------------------------------
Benchmark                                          Time           CPU Iterations
---------------------------------------------------------------------------------
CDT_Parse70                                     3082 ns       3082 ns     211951
CDT_Parse70                                     3878 ns       3878 ns     211951
CDT_Parse70                                     4710 ns       4710 ns     211951
CDT_Parse70                                     5367 ns       5367 ns     211951
CDT_Parse70                                     5288 ns       5288 ns     211951
CDT_Parse70_mean                                4465 ns       4465 ns     211951
CDT_Parse70_median                              4710 ns       4710 ns     211951
CDT_Parse70_stddev                               976 ns        976 ns     211951
CDT_Parse1                                        68 ns         68 ns   11184851
CDT_Parse1                                        77 ns         77 ns   11184851
CDT_Parse1                                        77 ns         77 ns   11184851
CDT_Parse1                                        69 ns         69 ns   11184851
CDT_Parse1                                        66 ns         66 ns   11184851
CDT_Parse1_mean                                   71 ns         71 ns   11184851
CDT_Parse1_median                                 69 ns         69 ns   11184851
CDT_Parse1_stddev                                  5 ns          5 ns   11184851
DateTime_Assign70<uint64_t>                     5005 ns       5005 ns     100000
DateTime_Assign70<uint64_t>                     4614 ns       4615 ns     100000
DateTime_Assign70<uint64_t>                     5133 ns       5133 ns     100000
DateTime_Assign70<uint64_t>                     4867 ns       4867 ns     100000
DateTime_Assign70<uint64_t>                     4713 ns       4713 ns     100000
DateTime_Assign70<uint64_t>_mean                4866 ns       4866 ns     100000
DateTime_Assign70<uint64_t>_median              4867 ns       4867 ns     100000
DateTime_Assign70<uint64_t>_stddev               211 ns        211 ns     100000
DateTime_Assign70<double>                       4807 ns       4807 ns     148387
DateTime_Assign70<double>                       4901 ns       4901 ns     148387
DateTime_Assign70<double>                       4635 ns       4635 ns     148387
DateTime_Assign70<double>                       4618 ns       4618 ns     148387
DateTime_Assign70<double>                       4648 ns       4648 ns     148387
DateTime_Assign70<double>_mean                  4722 ns       4722 ns     148387
DateTime_Assign70<double>_median                4648 ns       4648 ns     148387
DateTime_Assign70<double>_stddev                 126 ns        126 ns     148387
DateTime_AssignCompare70<uint64_t>              4606 ns       4606 ns     126006
DateTime_AssignCompare70<uint64_t>              4619 ns       4619 ns     126006
DateTime_AssignCompare70<uint64_t>              5009 ns       5009 ns     126006
DateTime_AssignCompare70<uint64_t>              5107 ns       5107 ns     126006
DateTime_AssignCompare70<uint64_t>              6167 ns       6167 ns     126006
DateTime_AssignCompare70<uint64_t>_mean         5101 ns       5101 ns     126006
DateTime_AssignCompare70<uint64_t>_median       5009 ns       5009 ns     126006
DateTime_AssignCompare70<uint64_t>_stddev        637 ns        637 ns     126006
DateTime_AssignCompare70<double>                6834 ns       6834 ns     113862
DateTime_AssignCompare70<double>                5838 ns       5838 ns     113862
DateTime_AssignCompare70<double>                5569 ns       5569 ns     113862
DateTime_AssignCompare70<double>                5136 ns       5136 ns     113862
DateTime_AssignCompare70<double>                5027 ns       5027 ns     113862
DateTime_AssignCompare70<double>_mean           5681 ns       5681 ns     113862
DateTime_AssignCompare70<double>_median         5569 ns       5569 ns     113862
DateTime_AssignCompare70<double>_stddev          723 ns        723 ns     113862
DateTime_Compare20<uint64_t>                       3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>                       3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>                       3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>                       3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>                       3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>_mean                  3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>_median                3 ns          3 ns  199932788
DateTime_Compare20<uint64_t>_stddev                0 ns          0 ns  199932788
DateTime_Compare20<double>                         3 ns          3 ns  244871823
DateTime_Compare20<double>                         3 ns          3 ns  244871823
DateTime_Compare20<double>                         3 ns          3 ns  244871823
DateTime_Compare20<double>                         3 ns          3 ns  244871823
DateTime_Compare20<double>                         3 ns          3 ns  244871823
DateTime_Compare20<double>_mean                    3 ns          3 ns  244871823
DateTime_Compare20<double>_median                  3 ns          3 ns  244871823
DateTime_Compare20<double>_stddev                  0 ns          0 ns  244871823
DateTime_ToString1<uint64_t>                     508 ns        508 ns    1626282
DateTime_ToString1<uint64_t>                     500 ns        500 ns    1626282
DateTime_ToString1<uint64_t>                     512 ns        512 ns    1626282
DateTime_ToString1<uint64_t>                     531 ns        531 ns    1626282
DateTime_ToString1<uint64_t>                     509 ns        509 ns    1626282
DateTime_ToString1<uint64_t>_mean                512 ns        512 ns    1626282
DateTime_ToString1<uint64_t>_median              509 ns        509 ns    1626282
DateTime_ToString1<uint64_t>_stddev               11 ns         11 ns    1626282
DateTime_ToString1<double>                       517 ns        517 ns    1273777
DateTime_ToString1<double>                       502 ns        502 ns    1273777
DateTime_ToString1<double>                       497 ns        497 ns    1273777
DateTime_ToString1<double>                       531 ns        531 ns    1273777
DateTime_ToString1<double>                       547 ns        547 ns    1273777
DateTime_ToString1<double>_mean                  519 ns        519 ns    1273777
DateTime_ToString1<double>_median                517 ns        517 ns    1273777
DateTime_ToString1<double>_stddev                 21 ns         21 ns    1273777
Test Name Median slower/faster
DateTime_Assign70<uint64_t> 4867 ns -
DateTime_Assign70<double> 4648 ns +
DateTime_AssignCompare70<uint64_t> 5009 ns +
DateTime_AssignCompare70<double> 5569 ns -
DateTime_Compare20<uint64_t> 3 ns -
DateTime_Compare20<double> 3 ns +
DateTime_ToString1<uint64_t> 509 ns +
DateTime_ToString1<double> 517 ns -

Conclusions

Comparison shows that double provides similar or sometimes better timings, despite our prior experience with older x86 processors. (Be it SSE2, AVX1 or AVX2 code).

We see that in each case performance of double-based algorithm is very, very close to one of int64-based. With small deviations to each side (positive or negative).

The only benchmark which has been constantly slower with doubles - was stringization DatetTime_ToString which is consistently showing number worse with double than with int64. But difference is very small and negligible in a longer run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment