QTzTimeZonePrivate: replace an inefficient QList with QVector (II)
The implementation-private QTzTransition type is larger than void*, so holding them in QLists is horribly inefficient. Fix by declaring it as a primitive types (it just contains various integers) and holding it in QVector instead. Also optimize parseTzTransitions() by preallocating the expected number of transitions and streaming directly into the container, resizing to the number of successful read items on error. Saves roughly 0.5K in text size, too. Change-Id: Iadec7a7b0721893e477e1778c9fb54afd6e49544 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
ddbf5f3c33
commit
ad67867d49
@ -119,6 +119,7 @@ struct QTzTransition {
|
|||||||
qint64 tz_time; // Transition time
|
qint64 tz_time; // Transition time
|
||||||
quint8 tz_typeind; // Type Index
|
quint8 tz_typeind; // Type Index
|
||||||
};
|
};
|
||||||
|
Q_DECLARE_TYPEINFO(QTzTransition, Q_PRIMITIVE_TYPE);
|
||||||
|
|
||||||
struct QTzType {
|
struct QTzType {
|
||||||
int tz_gmtoff; // UTC offset in seconds
|
int tz_gmtoff; // UTC offset in seconds
|
||||||
@ -176,27 +177,25 @@ static QTzHeader parseTzHeader(QDataStream &ds, bool *ok)
|
|||||||
return hdr;
|
return hdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QList<QTzTransition> parseTzTransitions(QDataStream &ds, int tzh_timecnt, bool longTran)
|
static QVector<QTzTransition> parseTzTransitions(QDataStream &ds, int tzh_timecnt, bool longTran)
|
||||||
{
|
{
|
||||||
QList<QTzTransition> tranList;
|
QVector<QTzTransition> transitions(tzh_timecnt);
|
||||||
|
|
||||||
if (longTran) {
|
if (longTran) {
|
||||||
// Parse tzh_timecnt x 8-byte transition times
|
// Parse tzh_timecnt x 8-byte transition times
|
||||||
for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
|
for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
|
||||||
QTzTransition tran;
|
ds >> transitions[i].tz_time;
|
||||||
ds >> tran.tz_time;
|
if (ds.status() != QDataStream::Ok)
|
||||||
if (ds.status() == QDataStream::Ok)
|
transitions.resize(i);
|
||||||
tranList.append(tran);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Parse tzh_timecnt x 4-byte transition times
|
// Parse tzh_timecnt x 4-byte transition times
|
||||||
int val;
|
int val;
|
||||||
for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
|
for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
|
||||||
QTzTransition tran;
|
|
||||||
ds >> val;
|
ds >> val;
|
||||||
tran.tz_time = val;
|
transitions[i].tz_time = val;
|
||||||
if (ds.status() == QDataStream::Ok)
|
if (ds.status() != QDataStream::Ok)
|
||||||
tranList.append(tran);
|
transitions.resize(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,10 +204,10 @@ static QList<QTzTransition> parseTzTransitions(QDataStream &ds, int tzh_timecnt,
|
|||||||
quint8 typeind;
|
quint8 typeind;
|
||||||
ds >> typeind;
|
ds >> typeind;
|
||||||
if (ds.status() == QDataStream::Ok)
|
if (ds.status() == QDataStream::Ok)
|
||||||
tranList[i].tz_typeind = typeind;
|
transitions[i].tz_typeind = typeind;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tranList;
|
return transitions;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QList<QTzType> parseTzTypes(QDataStream &ds, int tzh_typecnt)
|
static QList<QTzType> parseTzTypes(QDataStream &ds, int tzh_typecnt)
|
||||||
@ -568,7 +567,7 @@ void QTzTimeZonePrivate::init(const QByteArray &ianaId)
|
|||||||
QTzHeader hdr = parseTzHeader(ds, &ok);
|
QTzHeader hdr = parseTzHeader(ds, &ok);
|
||||||
if (!ok || ds.status() != QDataStream::Ok)
|
if (!ok || ds.status() != QDataStream::Ok)
|
||||||
return;
|
return;
|
||||||
QList<QTzTransition> tranList = parseTzTransitions(ds, hdr.tzh_timecnt, false);
|
QVector<QTzTransition> tranList = parseTzTransitions(ds, hdr.tzh_timecnt, false);
|
||||||
if (ds.status() != QDataStream::Ok)
|
if (ds.status() != QDataStream::Ok)
|
||||||
return;
|
return;
|
||||||
QList<QTzType> typeList = parseTzTypes(ds, hdr.tzh_typecnt);
|
QList<QTzType> typeList = parseTzTypes(ds, hdr.tzh_typecnt);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user