Контейнеры Qt быстрее добавляет элементы чем std, но медленнее получает. Сравнение тест
Решил сравнить скорости добавления и получения данных векторов и хеш-таблиц между версиями Qt и std. Интересно то, что контейнеры Qt быстрее добавляют, в случае с QHash добавление происходит почти в 2 раза быстрее чем в unordered_map. Однако получение элементов из std все же быстрее, результаты такие. Всегда ли std контейнеры медленнее на добавление?
----- START ----------------------
stdVec emplace: 303
QVector insert: 287
VecStd []: 99
QVector []: 185
unordered_map insert: 1127
unordered_map emplace: 1028
QHash insert: 652
unordered_map at(): 477
QHash value(): 540
QHash []: 560
insert std string: 401
insert QString: 421
UPD: в релизе с оптимизацией -О2:
----- START ----------------------
stdVec emplace: 101
QVector insert: 102
VecStd []: 17
QVector []: 18
unordered_map insert: 258
unordered_map emplace: 246
QHash insert: 290
unordered_map at(): 95
QHash value(): 293
QHash []: 290
insert std string: 310
insert QString: 237
код:
qDebug() << "----- START ---------------------- " ;
std::vector<std::function<void(MainWindow&)>> vecStd;
QVector<std::function<void(MainWindow&)>> vecQt;
std::unordered_map<std::string, std::function<void(MainWindow&)>> mapStd;
QHash<QString, std::function<void(MainWindow&)>> mapQhash;
std::function<void(MainWindow&)> f1 = &MainWindow::on_pushButton_Iridium_clicked;
std::function<void(MainWindow&)> f2 = &MainWindow::on_pushButton_Set_clicked;
std::function<void(MainWindow&)> f3 = &MainWindow::on_pushButton_Thuraya_clicked;
std::function<void(MainWindow&)> f4 = &MainWindow::on_pushButton_Inmarsat_clicked;
auto start = std::clock();
for(int i = 0; i < 1000000; i++)
{
vecStd.emplace_back(f1);
vecStd.emplace_back(f2);
vecStd.emplace_back(f3);
vecStd.emplace_back(f4);
}
auto stop = std::clock();
auto dif = stop - start;
qDebug() << "stdVec emplace:\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
vecQt.push_back(f1);
vecQt.push_back(f2);
vecQt.push_back(f3);
vecQt.push_back(f4);
}
stop = std::clock();
dif = stop - start;
qDebug() << "QVector insert:\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
auto res1 = vecStd[0];
auto res2 = vecStd[1];
auto res3 = vecStd[2];
auto res4 = vecStd[3];
}
stop = std::clock();
dif = stop - start;
qDebug() << "VecStd []:\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
auto res1 = vecQt[0];
auto res2 = vecQt[1];
auto res3 = vecQt[2];
auto res4 = vecQt[3];
}
stop = std::clock();
dif = stop - start;
qDebug() << "QVector []:\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
mapStd.insert({"f1", f1});
mapStd.insert({"f2", f2});
mapStd.insert({"f3", f3});
mapStd.insert({"f4", f4});
}
stop = std::clock();
dif = stop - start;
qDebug() << "unordered_map insert:\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
mapStd.emplace("f1", f1);
mapStd.emplace("f2", f2);
mapStd.emplace("f3", f3);
mapStd.emplace("f4", f4);
}
stop = std::clock();
dif = stop - start;
qDebug() << "unordered_map emplace:\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
mapQhash.insert("f1", f1);
mapQhash.insert("f2", f2);
mapQhash.insert("f3", f3);
mapQhash.insert("f4", f4);
}
stop = std::clock();
dif = stop - start;
qDebug() << "QHash insert:\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
auto res1 = mapStd.at("f1");
auto res2 = mapStd.at("f2");
auto res3 = mapStd.at("f3");
auto res4 = mapStd.at("f4");
}
stop = std::clock();
dif = stop - start;
qDebug() << "unordered_map at():\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
auto res1 = mapQhash.value("f1");
auto res2 = mapQhash.value("f2");
auto res3 = mapQhash.value("f3");
auto res4 = mapQhash.value("f4");
}
stop = std::clock();
dif = stop - start;
qDebug() << "QHash value():\t\t" << dif;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
auto res1 = mapQhash["f1"];
auto res2 = mapQhash["f2"];
auto res3 = mapQhash["f3"];
auto res4 = mapQhash["f4"];
}
stop = std::clock();
dif = stop - start;
qDebug() << "QHash []:\t\t" << dif;
//QVector<std::string> qvecStd;
std::vector<std::string> qvecStd;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
std::string s1 = "0123456789abcdef";
std::string s2 = "0123456789abcdef";
std::string s3 = "0123456789abcdef";
qvecStd.emplace_back(s1);
qvecStd.emplace_back(s2);
qvecStd.emplace_back(s3);
}
stop = std::clock();
dif = stop - start;
qDebug() << "insert std string:\t" << dif;
std::vector<QString> qvecQString;
start = std::clock();
for(int i = 0; i < 1000000; i++)
{
QString s1 = "0123456789abcdef";
QString s2 = "0123456789abcdef";
QString s3 = "0123456789abcdef";
qvecQString.emplace_back(s1);
qvecQString.emplace_back(s2);
qvecQString.emplace_back(s3);
}
stop = std::clock();
dif = stop - start;
qDebug() << "insert QString:\t\t" << dif;