рдореИрдВ Qt рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реВрдВред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, Qt рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝реЙрд░реЗрд╕реНрдЯ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рддрдирд╛ рдЙрдЪрд┐рдд рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреНрд╢рди рдореЗрдВ c ++ 11 рдХреЛ "рдорд╣рд╕реВрд╕" рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рдпрд╣рд╛рдБ рд╣реИ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рд╕рдордп рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм ...
рд╕рд╣рд╛рдпрдХ рд▓реЗрдЦрди
рдПрд╕рдЯреАрдПрд▓ рдФрд░ рдХреНрдпреВрдЯреА рдореЗрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рди рд▓рд┐рдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпреВрдЯреА рдХрдВрдЯреЗрдирд░ рдПрд╕рдЯреАрдПрд▓-рд╢реИрд▓реА рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд▓рд╣рд╛рд▓, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
template<typename TEST_CLASS> void runTests(int testCycles) { auto container = makeTestClass<TEST_CLASS>(); using namespace TestProcs; static auto tests = TestProcs::getRegisteredTests<TEST_CLASS>(); std::cout << "Run test for type:" << typeid(TEST_CLASS()).name() << std::endl; for (auto test : tests) { auto warmResultsTest = makeTestResults(*container, test.second, testCycles, true); std::cout << "\"" << test.first << "\" results(ms):" << getResultsString(warmResultsTest) << std::endl; } }
TestCycles рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред MakeTestClass рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
template<typename TEST_CLASS> std::shared_ptr<TEST_CLASS> makeTestClass() { return std::shared_ptr < TEST_CLASS > (new TEST_CLASS(VECTOR_SIZE, 0)); }
рдЦреИрд░, QList рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдП:
template<> std::shared_ptr<QList<TestType> > makeTestClass() { return std::shared_ptr < QList<TestType> > (new QList<TestType>( QList<TestType>::fromVector(QVector<TestType>(VECTOR_SIZE)))); }
TestProcs :: getRegisteredTests рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд╛рдо рдФрд░ рдХрдВрдЯреЗрдирд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
makeTestResults рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдХрдИ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдорд╛рдкрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд░реАрдХреНрд╖рдг рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рдФрд╕рдд, рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕реВрдЪреА
- std :: рдЬрдордирд╛ (doAccumulateTest)
- fort Qt рдореИрдХреНрд░реЛ (doQtForeachTest)
- рд╕реАрдорд╛-рдЖрдзрд╛рд░рд┐рдд (doNewForTestt)
- STL- рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП (doSTLForTest)
- рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрдд рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдПрд╕рдЯреАрдПрд▓-рд╢реИрд▓реА (doSTLForTest2)
namespace TestProcs { template<typename CONTAINER> int doAccumulateTest(CONTAINER& container) { typename CONTAINER::value_type sum = typename CONTAINER::value_type(); sum = std::accumulate(container.begin(), container.end(), sum); return sum; } template<typename CONTAINER> int doQtForeachTest(CONTAINER& container) { typename CONTAINER::value_type sum = typename CONTAINER::value_type(); foreach(auto item, container) { sum += item; } return sum; } template<typename CONTAINER> int doNewForTest(CONTAINER& container) { typename CONTAINER::value_type sum = typename CONTAINER::value_type(); for (auto item : container) { sum += item; } return sum; } template<typename CONTAINER> int doSTLForTest(CONTAINER& container) { typename CONTAINER::value_type sum = typename CONTAINER::value_type(); auto it = container.begin(); for (; it != container.end(); ++it) { sum += *it; } return sum; } template<typename CONTAINER> int doSTLForTest2(CONTAINER& container) { typename CONTAINER::value_type sum = typename CONTAINER::value_type(); auto it = container.begin(); auto end = container.end(); for (; it != end; ++it) { sum += *it; } return sum; } template<typename TEST_CLASS> const std::vector<typename Typedefs<TEST_CLASS>::TestProcRecord>& getRegisteredTests() { static const std::vector<typename Typedefs<TEST_CLASS>::TestProcRecord> tests { { "New for", &doNewForTest<TEST_CLASS> }, { "Accumulate", &doAccumulateTest<TEST_CLASS> }, { "Qt foreach", &doQtForeachTest<TEST_CLASS> }, { "STL for", &doSTLForTest<TEST_CLASS> }, { "STL for 2", &doSTLForTest2<TEST_CLASS> } }; return tests; } }
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо
рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд╕реВрдЪреА:
- QVector <qint32> (runTests <QVector <TestType >> (TEST_CYCLES))
- std :: рд╡реЗрдХреНрдЯрд░ <qint32> (рд░рдирдЯреИрд╕реНрдЯ <std: рд╡реЗрдХреНрдЯрд░ <TestType >> (TEST_CYLES))
- QList <qint32> (runTests <QList <TestType >> (TEST_CYCLES))
рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ = 20ред
рдХрдВрдЯреЗрдирд░ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ 30 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИред
рд╕рдордп рдХреЗ рдЕрдВрддрд░ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд
rdtsc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛
рдкреНрд░рддрд┐ 100,000 рд╣реИред
рджрд░рдЕрд╕рд▓, рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ (рдХрдо рдореВрд▓реНрдп рдХрд╛ рдЕрд░реНрде рд╣реИ рддреЗрдЬреА рд╕реЗ):

рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдЪрд┐рддреНрд░рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡:



рдкрд░рд┐рдгрд╛рдо
рдкрд░реАрдХреНрд╖рдг рдХрд░рд╛рдХрд░ рдореБрдЭреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ:
- рдлреЙрд░реНрдЪреНрдпреВрдирд┐рдХ рдореИрдХреНрд░реЛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ "рд░рд╛рдЗрдЯ" рдПрд╕рдЯреАрдПрд▓ рд▓реВрдкреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИ (рд╡реЗ рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдЗрдЯрд░реЗрдЯрд░ рдорд╛рди рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ)
- рдлреЙрд░реНрдЪреНрдпреВрдирд┐рдХ рдореИрдХреНрд░реЛ рдХреЛ рдПрд╕рдЯреАрдПрд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрддреА рд╕реЗ contraindicated рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдПрдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ (рдХреНрдпреВрдЯреА рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдЧрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА "рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрдзреАрди" рдирд╣реАрдВ рд╣реИрдВ)
- рдПрд╕рдЯреАрдбреА рдХреЗ рд▓рд┐рдП :: рд╡реЗрдХреНрдЯрд░ рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЗрдЯреНрд░реЗрдЯрд░ рдХреЗ рдЕрдВрддрд┐рдо рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд╣рд╛рдВ рдХреА рдЬрд╛рддреА рд╣реИ (рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ "рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░")
рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ Qt рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ foreach рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪ: рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рдмрд┐рдирд╛ ">>" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб