summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2013-09-13 11:20:55 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-13 19:37:51 +0200
commit63a382a93073a96457a41118753ae88547023cac (patch)
treec4b99d26e589e2f66ed67628c978c758eb525bb9
parent4c709fb3912ef65f83a5e604ffecc6a4a670a5cb (diff)
Add a static QFileInfo::exists(fileName) function
This avoids dynamic construction of the private class. According to the benchmark we go from 4,550 to 3,900 instruction reads per iteration. (without change 32629676 the baseline is 5,600) Change-Id: I5df925e30dbd49bdde87173e481820574ce5abe1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qfile.cpp2
-rw-r--r--src/corelib/io/qfileinfo.cpp22
-rw-r--r--src/corelib/io/qfileinfo.h1
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp1
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/main.cpp14
5 files changed, 39 insertions, 1 deletions
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 3af936122e..d991e86839 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -429,7 +429,7 @@ QFile::exists() const
bool
QFile::exists(const QString &fileName)
{
- return QFileInfo(fileName).exists();
+ return QFileInfo::exists(fileName);
}
/*!
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 93444cb47c..1d5f16c9d9 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -667,6 +667,28 @@ bool QFileInfo::exists() const
}
/*!
+ Returns true if the \a file exists; otherwise returns false.
+
+ \note If \a file is a symlink that points to a non-existing
+ file, false is returned.
+
+ \note Using this function is faster for than using
+ \c QFileInfo(file).exists() for file system access.
+*/
+bool QFileInfo::exists(const QString &file)
+{
+ QFileSystemEntry entry(file);
+ QFileSystemMetaData data;
+ QAbstractFileEngine *engine =
+ QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, data);
+ // Expensive fallback to non-QFileSystemEngine implementation
+ if (engine)
+ return QFileInfo(file).exists();
+ QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
+ return data.exists();
+}
+
+/*!
Refreshes the information about the file, i.e. reads in information
from the file system the next time a cached property is fetched.
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index 211c18d0a0..0f18261943 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -84,6 +84,7 @@ public:
void setFile(const QFile &file);
void setFile(const QDir &dir, const QString &file);
bool exists() const;
+ static bool exists(const QString &file);
void refresh();
QString filePath() const;
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index af2578ac37..d2171cc64a 100644
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -438,6 +438,7 @@ void tst_QFileInfo::exists()
QFileInfo fi(path);
QCOMPARE(fi.exists(), expected);
+ QCOMPARE(QFileInfo::exists(path), expected);
}
void tst_QFileInfo::absolutePath_data()
diff --git a/tests/benchmarks/corelib/io/qfileinfo/main.cpp b/tests/benchmarks/corelib/io/qfileinfo/main.cpp
index 2e63795978..594e5b7478 100644
--- a/tests/benchmarks/corelib/io/qfileinfo/main.cpp
+++ b/tests/benchmarks/corelib/io/qfileinfo/main.cpp
@@ -52,6 +52,8 @@ class qfileinfo : public QObject
{
Q_OBJECT
private slots:
+ void existsTemporary();
+ void existsStatic();
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
void symLinkTargetPerformanceLNK();
void symLinkTargetPerformanceMounpoint();
@@ -70,6 +72,18 @@ void qfileinfo::cleanupTestCase()
{
}
+void qfileinfo::existsTemporary()
+{
+ QString appPath = QCoreApplication::applicationFilePath();
+ QBENCHMARK { QFileInfo(appPath).exists(); }
+}
+
+void qfileinfo::existsStatic()
+{
+ QString appPath = QCoreApplication::applicationFilePath();
+ QBENCHMARK { QFileInfo::exists(appPath); }
+}
+
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
void qfileinfo::symLinkTargetPerformanceLNK()
{