Well, after looking at the code I can say that the was you wrote this benchmark "abuses" the QVector's copy-on-write semantic, making it somewhat biased towards std::vector — you use only non-const versions of QVector::begin(), QVector::end() and indexing methods. That leads to a lot of [obviously non-free] checks for sharing and possible detachment.
A few modifications (see the attachment) made the difference in read-only access negligible, in some tests QVector gave slightly better results than std::vector. QVector_fwd_it became more than 2x faster. The results, supposed to be displayed with a monospace font, are below. I reordered them to make it easier to compare how two containers behave in the same conditions. g++ 4.9.2 on a Debian GNU/Linux desktop with Intel Core i5-3570 3.4 GHz Test # of it. Original Modified ------------------------------------------------------------- stdvector_fwd_it 5 0.0908203125 0.08984375 QVector_fwd_it 5 0.185546875 0.0888671875 stdvector_fwd_it 10 0.078125 0.0771484375 QVector_fwd_it 10 0.169921875 0.08203125 stdvector_fwd_it 20 0.06640625 0.0693359375 QVector_fwd_it 20 0.15625 0.0712890625 stdvector_fwd_it 40 0.0634765625 0.064453125 QVector_fwd_it 40 0.169921875 0.0634765625 stdvector_fwd_it 50 0.07421875 0.07421875 QVector_fwd_it 50 0.16015625 0.0771484375 stdvector_fwd_it 80 0.0712890625 0.072265625 QVector_fwd_it 80 0.15234375 0.0791015625 stdvector_fwd_it 100 0.0654296875 0.0654296875 QVector_fwd_it 100 0.1484375 0.0703125 stdvector_fwd_it 1000 0.0537109375 0.0537109375 QVector_fwd_it 1000 0.13671875 0.0537109375 stdvector_fwd_it 10000 0.052734375 0.052734375 QVector_fwd_it 10000 0.13671875 0.052734375 stdvector_fwd_it 100000 0.052734375 0.052734375 QVector_fwd_it 100000 0.13671875 0.052734375 stdvector_fwd_it 1000000 0.921875 0.921875 QVector_fwd_it 1000000 1.453125 0.921875 stdvector_fwd_idx 5 0.08984375 0.0908203125 QVector_fwd_idx 5 0.123046875 0.0888671875 stdvector_fwd_idx 10 0.083984375 0.083984375 QVector_fwd_idx 10 0.111328125 0.0888671875 stdvector_fwd_idx 20 0.0810546875 0.107421875 QVector_fwd_idx 20 0.099609375 0.0830078125 stdvector_fwd_idx 40 0.0927734375 0.0927734375 QVector_fwd_idx 40 0.111328125 0.08203125 stdvector_fwd_idx 50 0.0869140625 0.087890625 QVector_fwd_idx 50 0.103515625 0.0908203125 stdvector_fwd_idx 80 0.0791015625 0.0791015625 QVector_fwd_idx 80 0.0986328125 0.0849609375 stdvector_fwd_idx 100 0.072265625 0.0732421875 QVector_fwd_idx 100 0.0927734375 0.078125 stdvector_fwd_idx 1000 0.056640625 0.056640625 QVector_fwd_idx 1000 0.08203125 0.0595703125 stdvector_fwd_idx 10000 0.0556640625 0.0556640625 QVector_fwd_idx 10000 0.0810546875 0.060546875 stdvector_fwd_idx 100000 0.0546875 0.0546875 QVector_fwd_idx 100000 0.080078125 0.05859375 stdvector_fwd_idx 1000000 0.9375 0.9375 QVector_fwd_idx 1000000 1.03125 0.953125 stdvector_pushback 5 7 6.25 QVector_pushback 5 9 8.25 stdvector_pushback 10 6.625 5.6875 QVector_pushback 10 9.125 8.5 stdvector_pushback 20 6.3125 5.4375 QVector_pushback 20 9.25 8.5 stdvector_pushback 40 6 5.5 QVector_pushback 40 9.5 8.875 stdvector_pushback 50 5.5 5 QVector_pushback 50 9.25 8.375 stdvector_pushback 80 5.75 5.1875 QVector_pushback 80 9.625 8.75 stdvector_pushback 100 5.3125 4.75 QVector_pushback 100 9.25 8.375 stdvector_pushback 1000 4.8125 4.1875 QVector_pushback 1000 8.875 8 stdvector_pushback 10000 5.4375 4.9375 QVector_pushback 10000 9.125 8.75 stdvector_pushback 100000 6.875 6.125 QVector_pushback 100000 10 9.75 stdvector_pushback 1000000 63 58 QVector_pushback 1000000 97 96 ------------------------------------------------------------- On 07/23/2015 08:51 AM, Gunnar Roth wrote: > >> Am 23.07.2015 um 07:00 schrieb Constantin Makshin <cmaks...@gmail.com>: >> >> "vector" branch is identical to "master“. > Not anymore ;-) > Thanks for the information.
diff --git a/src/tst_qtcontainerbench.cpp b/src/tst_qtcontainerbench.cpp index 7db866b..cc999fd 100644 --- a/src/tst_qtcontainerbench.cpp +++ b/src/tst_qtcontainerbench.cpp @@ -294,11 +294,12 @@ inline void insertdata(std::vector<std::vector<tVecData>> & m,int testcount ,bo m.clear(); m.resize(calcContainerCount(testcount)); - for(int i = testcount ;i>0 ;--i) + for(size_t x=0;x < m.size();++x) { - for(size_t x=0;x < m.size();++x) + auto & v = m[x]; + for(int i = testcount ;i>0 ;--i) { - m[x].push_back(tVecData(MAKE_KEY(i),i)); + v.push_back(tVecData(MAKE_KEY(i),i)); } } if(!sorted) return; @@ -312,11 +313,12 @@ inline void insertdata(std::vector<QVector<tVecData>> & m,int testcount,bool so m.clear(); m.resize(calcContainerCount(testcount)); - for(int i = testcount ;i>0 ;--i) + for(size_t x=0;x < m.size();++x) { - for(size_t x=0;x < m.size();++x) + auto & v = m[x]; + for(int i = testcount ;i>0 ;--i) { - m[x].push_back(tVecData(MAKE_KEY(i),i)); + v.push_back(tVecData(MAKE_KEY(i),i)); } } if(!sorted) return; @@ -653,7 +655,8 @@ void QtContainerBench::testCase_iterate_vector() QBENCHMARK { for(size_t x=0;x < m.size();++x) { - for(auto it =std::begin(m[x]) ;it != std::end(m[x]) ; ++it) + const auto & v = m[x]; + for(auto it =std::begin(v) ;it != std::end(v) ; ++it) { if((it->second) == 0) QFAIL( "fail"); @@ -670,7 +673,8 @@ void QtContainerBench::testCase_iterate_vector() QBENCHMARK { for(size_t x=0;x < m.size();++x) { - for(auto it =std::begin(m[x]) ;it != std::end(m[x]) ; ++it) + const auto& v = m[x]; + for(auto it =std::begin(v) ;it != std::end(v) ; ++it) { if((it->second) == 0) QFAIL( "fail"); @@ -685,11 +689,11 @@ void QtContainerBench::testCase_iterate_vector() QBENCHMARK { for(size_t x=0;x < m.size();++x) { - size_t sz= m[x].size(); - auto & v = m[x]; + const auto & v = m[x]; + const size_t sz= v.size(); for(size_t i = 0 ;i < sz ; ++i) { - auto & e =v[i]; + const auto & e =v[i]; if((e.second) == 0) QFAIL( "fail"); } @@ -705,11 +709,11 @@ void QtContainerBench::testCase_iterate_vector() QBENCHMARK { for(size_t x=0;x < m.size();++x) { - size_t sz= m[x].size(); - auto & v = m[x]; + const auto & v = m[x]; + const size_t sz= v.size(); for(size_t i = 0 ;i < sz ; ++i) { - auto & e =v[i]; + const auto & e =v[i]; if((e.second) == 0) QFAIL( "fail"); }
Test # of it. Original Modified ------------------------------------------------------------- stdvector_fwd_it 5 0.0908203125 0.08984375 QVector_fwd_it 5 0.185546875 0.0888671875 stdvector_fwd_it 10 0.078125 0.0771484375 QVector_fwd_it 10 0.169921875 0.08203125 stdvector_fwd_it 20 0.06640625 0.0693359375 QVector_fwd_it 20 0.15625 0.0712890625 stdvector_fwd_it 40 0.0634765625 0.064453125 QVector_fwd_it 40 0.169921875 0.0634765625 stdvector_fwd_it 50 0.07421875 0.07421875 QVector_fwd_it 50 0.16015625 0.0771484375 stdvector_fwd_it 80 0.0712890625 0.072265625 QVector_fwd_it 80 0.15234375 0.0791015625 stdvector_fwd_it 100 0.0654296875 0.0654296875 QVector_fwd_it 100 0.1484375 0.0703125 stdvector_fwd_it 1000 0.0537109375 0.0537109375 QVector_fwd_it 1000 0.13671875 0.0537109375 stdvector_fwd_it 10000 0.052734375 0.052734375 QVector_fwd_it 10000 0.13671875 0.052734375 stdvector_fwd_it 100000 0.052734375 0.052734375 QVector_fwd_it 100000 0.13671875 0.052734375 stdvector_fwd_it 1000000 0.921875 0.921875 QVector_fwd_it 1000000 1.453125 0.921875 stdvector_fwd_idx 5 0.08984375 0.0908203125 QVector_fwd_idx 5 0.123046875 0.0888671875 stdvector_fwd_idx 10 0.083984375 0.083984375 QVector_fwd_idx 10 0.111328125 0.0888671875 stdvector_fwd_idx 20 0.0810546875 0.107421875 QVector_fwd_idx 20 0.099609375 0.0830078125 stdvector_fwd_idx 40 0.0927734375 0.0927734375 QVector_fwd_idx 40 0.111328125 0.08203125 stdvector_fwd_idx 50 0.0869140625 0.087890625 QVector_fwd_idx 50 0.103515625 0.0908203125 stdvector_fwd_idx 80 0.0791015625 0.0791015625 QVector_fwd_idx 80 0.0986328125 0.0849609375 stdvector_fwd_idx 100 0.072265625 0.0732421875 QVector_fwd_idx 100 0.0927734375 0.078125 stdvector_fwd_idx 1000 0.056640625 0.056640625 QVector_fwd_idx 1000 0.08203125 0.0595703125 stdvector_fwd_idx 10000 0.0556640625 0.0556640625 QVector_fwd_idx 10000 0.0810546875 0.060546875 stdvector_fwd_idx 100000 0.0546875 0.0546875 QVector_fwd_idx 100000 0.080078125 0.05859375 stdvector_fwd_idx 1000000 0.9375 0.9375 QVector_fwd_idx 1000000 1.03125 0.953125 stdvector_pushback 5 7 6.25 QVector_pushback 5 9 8.25 stdvector_pushback 10 6.625 5.6875 QVector_pushback 10 9.125 8.5 stdvector_pushback 20 6.3125 5.4375 QVector_pushback 20 9.25 8.5 stdvector_pushback 40 6 5.5 QVector_pushback 40 9.5 8.875 stdvector_pushback 50 5.5 5 QVector_pushback 50 9.25 8.375 stdvector_pushback 80 5.75 5.1875 QVector_pushback 80 9.625 8.75 stdvector_pushback 100 5.3125 4.75 QVector_pushback 100 9.25 8.375 stdvector_pushback 1000 4.8125 4.1875 QVector_pushback 1000 8.875 8 stdvector_pushback 10000 5.4375 4.9375 QVector_pushback 10000 9.125 8.75 stdvector_pushback 100000 6.875 6.125 QVector_pushback 100000 10 9.75 stdvector_pushback 1000000 63 58 QVector_pushback 1000000 97 96
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest