QT里将字符串或工夫戳转换为QDateTime不同办法性能比拟(release编译下)
环境:
Qt:6.2.3(MSVC 2019, 64 bit)
QtCreator:7.0.2
c++:17
boost:1.8
办法:
1.应用QDateTime自带的fromString办法
不思考如下函数,因为Qt::TextDate解析形式限度死了字符串格局,必须为"ddd MMM d HH:mm:ss yyyy"
QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format = Qt::TextDate)
应用如下函数
QDateTime QDateTime::fromString(QStringView string, QStringView format, QCalendar cal = QCalendar())
2.应用substring按字符串格局进行字符串截取,而后调用QDateTime构造方法
3.将字符串传给boost库的posix_time的fromstring,而后调用QDateTime构造方法
4.应用工夫戳形式
论断
substring->工夫戳->QDateTime::fromString->Boost_posix_time;
10000条
100000条
测试代码
#include <QCoreApplication>#include <QDateTime>#include <QSharedPointer>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>using namespace boost::posix_time;const static std::string dateTimeStdStr = "2022/10/12 08:10:13";const static QString dateTimeFormat = "yyyy/MM/dd HH:mm:ss";const static qint64 dateTimeStamp = 1669362601364;QString printResult(QList<qint64> list) { qint64 total = 0; QString result = ""; for (int i = 0; i < list.size(); i++) { result += QString("%1ms,").arg(list.at(i)); total += list.at(i); } result += QString("均匀:%1ms").arg(total / list.size()); return result;}int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); // init data int size = 100000, testTimes = 10; QMap<QString, void (*)()> funcMap; QMap<QString, QList<qint64>> consumeTimeMap; QVector<QString> vector = {"String:调用QDateTime::fromString办法转换", "String:substring截取交给QDateTime结构", "String:传给boost的fromstring,再交给QDateTime结构", "Int工夫戳:调用QDateTime::fromMSecsSinceEpoch办法转换"}; funcMap.insert(vector.at(0), []() { QDateTime temp = QDateTime::fromString(dateTimeStdStr.c_str(), dateTimeFormat); }); funcMap.insert(vector.at(1), []() { int year = atoi(dateTimeStdStr.substr(0, 4).c_str()); int month = atoi(dateTimeStdStr.substr(5, 2).c_str()); int day = atoi(dateTimeStdStr.substr(8, 2).c_str()); int hour = atoi(dateTimeStdStr.substr(11, 2).c_str()); int minute = atoi(dateTimeStdStr.substr(14, 2).c_str()); int second = atoi(dateTimeStdStr.substr(17, 2).c_str()); QDateTime temp = QDateTime(QDate(year, month, day), QTime(hour, minute, second)); }); funcMap.insert(vector.at(2), []() { const std::locale loc = std::locale(std::locale::classic(), new time_input_facet("%Y-%m-%d %H:%M:%S")); std::istringstream is(dateTimeStdStr); is.imbue(loc); boost::posix_time::ptime t; is >> t; tm pt_tm = to_tm(t); QDateTime dateTime = QDateTime(QDate(pt_tm.tm_year, pt_tm.tm_mon, pt_tm.tm_mday), QTime(pt_tm.tm_hour, pt_tm.tm_min, pt_tm.tm_sec)); }); funcMap.insert(vector.at(3), []() { QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(dateTimeStamp); }); // start test qDebug() << QString("开始测试,数据量为%1,测试次数为%2").arg(size).arg(testTimes); for (int i = 0; i < vector.size(); i++) { QString key = vector.at(i); QList<qint64> consumeTimeList; for (int j = 0; j < testTimes; j++) { qint64 startTime = QDateTime::currentMSecsSinceEpoch(); void (*func)() = funcMap.value(key); for (int k = 0; k < size; k++) { func(); } qint64 endTime = QDateTime::currentMSecsSinceEpoch(); consumeTimeList.push_back(endTime - startTime); } consumeTimeMap.insert(key, consumeTimeList); } for (int i = 0; i < vector.size(); i++) { QString key = vector.at(i); qDebug() << QString("测试%1完结,执行状况(%2)").arg(key).arg(printResult(consumeTimeMap.value(key))); } return a.exec();}