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.