On 2/16/2016 11:56 AM, Benedek Thaler wrote:
Dear Boost,
In a previous mail, I introduced a container library, `double_ended`. This library has benchmarks [0]. However, the benchmarks show unexpected results.
This is what I do [1]: - compile program using G++ 5.3, -O2 - remove CPU0 from kernel scheduler pool (isolcpu=0 boot flag) - disable CPU scaling - pin benchmark thread to CPU0 - in the test, create a vector - reserve memory for 1M unsigned - write a byte to each page reserved, to warm up the page table - get TSC value (machine has constant_tsc flag) - insert 1M unsigned value - get TSC value again, subtract previous value - repeat test 25 times, average results
I do this with 3 containers: std::vector, boost::container::vector and double_ended::devector. While the latter two produces almost equivalent results, std::vector seriously falls behind.
- No reallocation happens between the TSC sampling - Test order doesn't matter: every order produces the same results - Container size or sample count doesn't matter, same results. - The deviations of individual measures of each container is small, the performance is consistent. - I compared the produced ASM of std::vector and double_ended::devector, they are very similar, almost the same instructions in different order [2].
What do I miss here?
Thanks, Benedek
[0]: http://erenon.hu/double_ended/double_ended/benchmarks.html [1]: https://github.com/erenon/double_ended/blob/master/benchmark/push_back.cpp [2]: http://pastebin.com/tUL54i9f
FWIW I can't reproduce your results on Visual Studio 2015 Update 1. Here are my results if you're interested. X std::vector 0 0 100 592.380000 200 1178.640000 400 2310.270000 800 4517.580000 1600 8893.160000 3200 17600.610000 6400 35895.900000 12800 71004.060000 25600 142081.980000 51200 283691.720000 102400 567921.980000 204800 1138470.790000 409600 2274810.920000 819200 4556220.740000 X devector 0 0 100 711.840000 200 1458.540000 400 2924.550000 800 5862.690000 1600 11653.440000 3200 23825.170000 6400 46841.700000 12800 93916.710000 25600 187148.900000 51200 372430.440000 102400 745044.570000 204800 1488865.490000 409600 2971389.220000 819200 5942622.180000 X boost::container::vector 0 0 100 837.930000 200 1666.050000 400 3259.280000 800 6423.750000 1600 12706.180000 3200 25197.520000 6400 50089.290000 12800 100486.150000 25600 200127.660000 51200 398981.780000 102400 800517.160000 204800 1610967.220000 409600 3250085.410000 819200 6454347.270000 X std::deque 0 0 100 18529.880000 200 25942.200000 400 38937.040000 800 59459.400000 1600 100410.640000 3200 175987.360000 6400 321362.520000 12800 569617.680000 25600 1019693.840000 51200 1930645.720000 102400 3806069.880000 204800 7704495.360000 409600 15629599.200000 819200 31983278.800000 X batch_deque 0 0 100 991.760000 200 1735.560000 400 3127.280000 800 5864.880000 1600 11357.320000 3200 22291.800000 6400 44334.520000 12800 88523.040000 25600 179476.320000 51200 358522.960000 102400 716579.960000 204800 1433212.760000 409600 2868735.640000 819200 5741968.240000 X boost::container::deque 0 0 100 1187.320000 200 4253.640000 400 6874.320000 800 11220.320000 1600 20418.400000 3200 38970.160000 6400 74156.560000 12800 142497.720000 25600 281098.400000 51200 537988.920000 102400 1084152.000000 204800 2232533.560000 409600 4669299.360000 819200 9431670.920000