speedup C dependency scanning even more

Scanning the dependencies for kdelibs/khtml/ (when all files are scanned) is
now down to 4.6 s from 6.3 s before this change (without the
headerLocationCache it takes about 14 s here).
It doesn't really make sense to include the complete include path as part
of the key for the map, since the include path will be the same for
all files in a project, so it doesn't add anything.

Alex
This commit is contained in:
Alexander Neundorf 2009-10-06 13:57:41 -04:00
parent 9000b5a4de
commit 8a5ae4c15e
1 changed files with 7 additions and 23 deletions

View File

@ -149,10 +149,8 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
std::set<cmStdString> dependencies;
std::set<cmStdString> scanned;
// Use reserve to allocate enough memory for both strings,
// Use reserve to allocate enough memory for tempPathStr
// so that during the loops no memory is allocated or freed
std::string cacheKey;
cacheKey.reserve(4*1024);
std::string tempPathStr;
tempPathStr.reserve(4*1024);
@ -181,22 +179,8 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
}
else
{
// With GCC distribution of STL, assigning to a string directly
// throws away the internal buffer of the left-hand-side. We
// want to keep the pre-allocated buffer so we use C-style
// string assignment and then operator+=. We could call
// .clear() instead of assigning to an empty string but the
// method does not exist on some older compilers.
cacheKey = "";
cacheKey += current.FileName;
for(std::vector<std::string>::const_iterator i =
this->IncludePath.begin(); i != this->IncludePath.end(); ++i)
{
cacheKey+=*i;
}
std::map<cmStdString, cmStdString>::iterator
headerLocationIt=this->HeaderLocationCache.find(cacheKey);
headerLocationIt=this->HeaderLocationCache.find(current.FileName);
if (headerLocationIt!=this->HeaderLocationCache.end())
{
fullName=headerLocationIt->second;
@ -214,16 +198,16 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
}
else
{
tempPathStr += *i;
tempPathStr+="/";
tempPathStr+=current.FileName;
tempPathStr += *i;
tempPathStr+="/";
tempPathStr+=current.FileName;
}
// Look for the file in this location.
if(cmSystemTools::FileExists(tempPathStr.c_str(), true))
{
fullName = tempPathStr;
HeaderLocationCache[cacheKey]=fullName;
fullName = tempPathStr;
HeaderLocationCache[current.FileName]=fullName;
break;
}
}