Я/o функция занимает слишком много времени


//parses the text path vector into the engine
void Level::PopulatePathVectors(string pathTable)
{
    // Read the file line by line.
    ifstream myFile(pathTable);

        for (unsigned int i = 0; i < nodes.size(); i++)
        {
            pathLookupVectors.push_back(vector<vector<int>>());

            for (unsigned int j = 0; j < nodes.size(); j++)
            {
                string line;

                if (getline(myFile, line)) //enter if a line is read successfully
                {
                    stringstream ss(line);
                    istream_iterator<int> begin(ss), end;
                    pathLookupVectors[i].push_back(vector<int>(begin, end));
                }
            }
        }
    myFile.close();
}

Эта функция занимает около 5 минут, чтобы пройти в текстовый файл, который 744 * 744 строк. Каждая строка представляет собой список целых чисел такой:

1 4 6 24 7 4 8 n

они могут быть разной длины. Я понятия не имею, почему он так долго, но она должна работать в считанные секунды, а не минуты! Самое смешное, что ту же функцию в C# (на самом деле очень unoptimised версия) фактически только принять секунд, чтобы убежать.

Может быть проблема в настройке?

Это ссылка на путь к таблице анализа http://dl.dropbox.com/u/13519335/WepTestLevelPathTable.txt



298
7
задан 8 ноября 2011 в 02:11 Источник Поделиться
Комментарии
1 ответ

Я настройка узлов.размер (), чтобы вернуться 744.
Тогда это заставляет всех 553536 для чтения из файла.

Когда я запускаю свой код, он завершает за 3,8 секунды (с -О3 занимает 2,5 секунды).

Если я Обновить код, чтобы зарезервировать нужное количество пространства в каждом векторе мы можем сократить время, которое требуется получить: 3,3 секунды (с -О3 2,2 секунды).

Так что за 5 минут ты цитируешь там должны быть некоторые другие ошибки в коде.

Комментарии на ваш код:

Не изменяемые параметры по ссылке стоимость (чтобы избежать копирования).

void Level::PopulatePathVectors(string pathTable)

Добавить строки оставляем за собой соответствующие места в каждом векторе. Это позволит избежать многократного распределения вектора во время чтения. Это важно, когда у вас трижды вложенный вектор.

    pathLookupVectors.push_back(vector<vector<int> >());
pathLookupVectors.reserve(nodes.size()); // Add this line

for (unsigned int i = 0; i < nodes.size(); i++)
{
pathLookupVectors.push_back(vector<vector<int>>());
pathLookupVectors.back().reserve(nodes.size()) // Add this line

Нет необходимости вручную закройте файл.
см https://stackoverflow.com/q/748014/14065
Реализация с использованием fstream не оценки

myFile.close();

5
ответ дан 8 ноября 2011 в 03:11 Источник Поделиться