Use a QVector<QDateTime> instead of an array in QFileInfoPrivate

Since QDateTime is pimpled, default allocation is expensive and
regularly shows up in profiles of code using QFileInfo.

For Qt 6, QDateTime's data members should be put into the class
proper, and this change here reverted.

Change-Id: I94a50e467b12772e1076181eb2ac6031984d8802
Reviewed-by: Thorbjørn Lindeijer <bjorn@lindeijer.nl>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
hjk 2013-04-22 08:34:53 +02:00 committed by The Qt Project
parent 38bf6da7dd
commit 32629676b9
3 changed files with 13 additions and 1 deletions

View File

@ -187,6 +187,8 @@ uint QFileInfoPrivate::getFileFlags(QAbstractFileEngine::FileFlags request) cons
QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request) const
{
Q_ASSERT(fileEngine); // should never be called when using the native FS
if (fileTimes.size() != 3)
fileTimes.resize(3);
if (!cache_enabled)
clearFlags();
uint cf;

View File

@ -58,6 +58,7 @@
#include "qatomic.h"
#include "qshareddata.h"
#include "qfilesystemengine_p.h"
#include "qvector.h"
#include <QtCore/private/qabstractfileengine_p.h>
#include <QtCore/private/qfilesystementry_p.h>
@ -152,7 +153,12 @@ public:
bool cache_enabled : 1;
mutable uint fileFlags;
mutable qint64 fileSize;
mutable QDateTime fileTimes[3];
// ### Qt6: FIXME: This vector is essentially a plain array
// mutable QDateTime fileTimes[3], but the array is slower
// to initialize than the QVector as QDateTime has a pimpl.
// In Qt 6, QDateTime should inline its data members,
// and this here can be an array again.
mutable QVector<QDateTime> fileTimes;
inline bool getCachedFlag(uint c) const
{ return cache_enabled ? (cachedFlags & c) : 0; }
inline void setCachedFlag(uint c) const

View File

@ -262,6 +262,10 @@ public:
private:
friend class QDateTimePrivate;
void detach();
// ### Qt6: Using a private here has high impact on runtime
// on users such as QFileInfo. In Qt 6, the data members
// should be inlined.
QExplicitlySharedDataPointer<QDateTimePrivate> d;
#ifndef QT_NO_DATASTREAM