ENH: Patch from Alex to speed dependency scanning approximately 2x.

This commit is contained in:
Brad King 2006-09-13 12:43:32 -04:00
parent 6ce165de43
commit 6a347e9858
2 changed files with 45 additions and 15 deletions

View File

@ -47,7 +47,7 @@ cmDependsC::~cmDependsC()
this->WriteCacheFile(); this->WriteCacheFile();
for (std::map<cmStdString, cmIncludeLines*>::iterator it= for (std::map<cmStdString, cmIncludeLines*>::iterator it=
this->fileCache.begin(); it!=this->fileCache.end(); ++it) this->FileCache.begin(); it!=this->FileCache.end(); ++it)
{ {
delete it->second; delete it->second;
} }
@ -84,6 +84,13 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
std::set<cmStdString> dependencies; std::set<cmStdString> dependencies;
std::set<cmStdString> scanned; std::set<cmStdString> scanned;
// Use reserve to allocate enough memory for both strings,
// 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);
while(!this->Unscanned.empty()) while(!this->Unscanned.empty())
{ {
// Get the next file to scan. // Get the next file to scan.
@ -109,26 +116,48 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
} }
else 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 = for(std::vector<std::string>::const_iterator i =
this->IncludePath->begin(); i != this->IncludePath->end(); ++i) this->IncludePath->begin(); i != this->IncludePath->end(); ++i)
{ {
cacheKey+=*i;
}
std::map<cmStdString, cmStdString>::iterator headerLocationIt=this->HeaderLocationCache.find(cacheKey);
if (headerLocationIt!=this->HeaderLocationCache.end())
{
fullName=headerLocationIt->second;
}
else for(std::vector<std::string>::const_iterator i =
this->IncludePath->begin(); i != this->IncludePath->end(); ++i)
{
// Construct the name of the file as if it were in the current // Construct the name of the file as if it were in the current
// include directory. Avoid using a leading "./". // include directory. Avoid using a leading "./".
std::string temp = *i;
if(temp == ".") tempPathStr = "";
if((*i) == ".")
{ {
temp = ""; tempPathStr += current.FileName;
} }
else else
{ {
temp += "/"; tempPathStr += *i;
tempPathStr+="/";
tempPathStr+=current.FileName;
} }
temp += current.FileName;
// Look for the file in this location. // Look for the file in this location.
if(cmSystemTools::FileExists(temp.c_str())) if(cmSystemTools::FileExists(tempPathStr.c_str()))
{ {
fullName = temp; fullName = tempPathStr;
HeaderLocationCache[cacheKey]=fullName;
break; break;
} }
} }
@ -152,8 +181,8 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj,
// Check whether this file is already in the cache // Check whether this file is already in the cache
std::map<cmStdString, cmIncludeLines*>::iterator fileIt= std::map<cmStdString, cmIncludeLines*>::iterator fileIt=
this->fileCache.find(fullName); this->FileCache.find(fullName);
if (fileIt!=this->fileCache.end()) if (fileIt!=this->FileCache.end())
{ {
fileIt->second->Used=true; fileIt->second->Used=true;
dependencies.insert(fullName); dependencies.insert(fullName);
@ -248,7 +277,7 @@ void cmDependsC::ReadCacheFile()
if ((res==true) && (newer==1)) //cache is newer than the parsed file if ((res==true) && (newer==1)) //cache is newer than the parsed file
{ {
cacheEntry=new cmIncludeLines; cacheEntry=new cmIncludeLines;
this->fileCache[line]=cacheEntry; this->FileCache[line]=cacheEntry;
} }
} }
else if (cacheEntry!=0) else if (cacheEntry!=0)
@ -281,8 +310,8 @@ void cmDependsC::WriteCacheFile() const
} }
for (std::map<cmStdString, cmIncludeLines*>::const_iterator fileIt= for (std::map<cmStdString, cmIncludeLines*>::const_iterator fileIt=
this->fileCache.begin(); this->FileCache.begin();
fileIt!=this->fileCache.end(); ++fileIt) fileIt!=this->FileCache.end(); ++fileIt)
{ {
if (fileIt->second->Used) if (fileIt->second->Used)
{ {
@ -313,7 +342,7 @@ void cmDependsC::Scan(std::istream& is, const char* directory,
{ {
cmIncludeLines* newCacheEntry=new cmIncludeLines; cmIncludeLines* newCacheEntry=new cmIncludeLines;
newCacheEntry->Used=true; newCacheEntry->Used=true;
this->fileCache[fullName]=newCacheEntry; this->FileCache[fullName]=newCacheEntry;
// Read one line at a time. // Read one line at a time.
std::string line; std::string line;

View File

@ -80,7 +80,8 @@ protected:
std::queue<UnscannedEntry> Unscanned; std::queue<UnscannedEntry> Unscanned;
t_CharBuffer Buffer; t_CharBuffer Buffer;
std::map<cmStdString, cmIncludeLines *> fileCache; std::map<cmStdString, cmIncludeLines *> FileCache;
std::map<cmStdString, cmStdString> HeaderLocationCache;
cmStdString CacheFileName; cmStdString CacheFileName;