Мне нужно обработать список файлов. Действие обработки не должно повторяться для одного и того же файла. Код, который я использую для этого, -
using namespace std;
vector<File*> gInputFileList; //Can contain duplicates, File has member sFilename
map<string, File*> gProcessedFileList; //Using map to avoid linear search costs
void processFile(File* pFile)
{
File* pProcessedFile = gProcessedFileList[pFile->sFilename];
if(pProcessedFile != NULL)
return; //Already processed
foo(pFile); //foo() is the action to do for each file
gProcessedFileList[pFile->sFilename] = pFile;
}
void main()
{
size_t n= gInputFileList.size(); //Using array syntax (iterator syntax also gives identical performance)
for(size_t i=0; i<n; i++){
processFile(gInputFileList[i]);
}
}
Код работает правильно, но...
Моя проблема в том, что когда размер ввода составляет 1000, это занимает 30 минут - HALF AN HOUR - в Windows/Visual Studio 2008 Express. Для того же входа требуется всего 40 секунд для запуска Linux/gcc!
В чем может быть проблема? Действие foo() выполняется только очень короткое время, когда используется отдельно. Должен ли я использовать что-то вроде vector:: reserve для карты?
РЕДАКТИРОВАТЬ, ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Что делает foo(): 1. он открывает файл 2. читает его в памяти 3. закрывает файл 4. анализируется содержимое файла в памяти 5. он строит список жетонов; Я использую для этого вектор.
Всякий раз, когда я нарушаю программу (во время запуска программы с установленным входом с 1000+ файлами): стек вызовов показывает, что программа находится в середине добавления std::vector.