When mode != MatchExtension is passed to
QMimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode) const
a QFileInfo object is always created and used to check
QFileInfo::isDir(). Replace this expensive approach with a very cheap
(bitmask) S_ISDIR check under Q_OS_UNIX. QT_STAT is already called for
other reasons, so we just reuse its result in the S_ISDIR check.
Extract almost all code from
QMimeDatabase::mimeTypeForFile(const QString &, MatchMode) const;
QMimeDatabase::mimeTypeForData(QIODevice *) const;
QMimeDatabase::mimeTypeForFile(const QFileInfo &, MatchMode) const
into
QMimeDatabasePrivate::mimeTypeForFileExtension(const QString &);
QMimeDatabasePrivate::mimeTypeForData(QIODevice *);
QMimeDatabasePrivate::mimeTypeForFile(const QString &, const QFileInfo *, QMimeDatabase::MatchMode)
respectively. This refactoring is a less convoluted and more efficient
alternative to adding more mutex-unlocking hacks. The existing
QMutexLocker::unlock() calls are thereby eliminated.
The following table contains the average results of the benchmark
tst_QMimeDatabase::benchMimeTypeForFile() on my GNU/Linux system before
and at this commit. The numbers denote milliseconds per iteration.
This commit does not measurably affect performance when
mode == MatchExtension, therefore the MatchExtension section contains a
single column with results common to both commits (it is interesting to
compare benchmark results across match modes).
data row tag before at
MatchDefault:
archive 0.012 0.010
OpenDocument Text 0.012 0.010
existent archive with extension 0.022 0.018
existent C with extension 0.016 0.012
existent text file with extension 0.017 0.012
existent C w/o extension 0.072 0.067
existent patch w/o extension 0.10 0.10
existent archive w/o extension 0.064 0.060
MatchExtension:
archive 0.0081
OpenDocument Text 0.0076
existent archive with extension 0.012
existent C with extension 0.0075
existent text file with extension 0.0076
existent C w/o extension 0.0122
existent patch w/o extension 0.0091
existent archive w/o extension 0.0091
MatchContent:
archive 0.0098 0.0078
OpenDocument Text 0.0098 0.0078
existent archive with extension 0.051 0.047
existent C with extension 0.051 0.047
existent text file with extension 0.053 0.049
existent C w/o extension 0.058 0.054
existent patch w/o extension 0.099 0.095
existent archive w/o extension 0.054 0.050
Change-Id: I01b37c9645f0d8d35fd1a6ea1c7a99be2faeeb73
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: David Faure <david.faure@kdab.com>