Почему это намного медленнее в C ++?

Я преобразовал этот простой метод из C # в C ++. Он читает таблицу путей и заполняет список списков целых чисел (или вектор векторов целых чисел).

Пример строки из таблицы путей будет выглядеть примерно так:

0 12 5 16 n

Я понимаю, что есть более эффективные способы сделать это в целом, но пока я просто хочу знать, почему мой код C ++ принимает , поэтому намного длиннее. например 10 минут вместо 10 секунд в версии C #. Вот мой код на C ++. Полагаю, я сделал что-то в корне не так.

//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>());

            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 begin(ss), end;
                    pathLookupVectors[i].push_back(vector(begin, end));
                }
            }
        }
    myFile.close();
}

Вот версия C #:

private void PopulatePathLists(string pathList)
{
    // Read the file and display it line by line.
    StreamReader streamReader = new StreamReader(pathList);

    for (int i = 0; i < nodes.Count; i++)
    {
        pathLookupLists.Add(new List>());

        for (int j = 0; j < nodes.Count; j++)
        {
            string str = streamReader.ReadLine();
            pathLookupLists[i].Add(new List());

            //For every string (list of ints) - put each one into these lists
            int count = 0;
            string tempString = "";

            while (str[count].ToString() != "n") //While character does not equal null terminator
            {
                if (str[count].ToString() == " ") //Character equals space, set the temp string 
                                                  //as the node index, and move on
                {
                    pathLookupLists[i][j].Add(Convert.ToInt32(tempString));
                    tempString = "";
                }
                else //If characters are adjacent, put them together
                {
                    tempString = tempString + str[count];
                }
                count++;
            }
        }
    }
    streamReader.Close();
}

Извините, это так специфично, но я в тупике.

РЕДАКТИРОВАТЬ - Многие люди сказали, что они протестировали этот код, и для них это занимает всего несколько секунд. Все, что я знаю, это то, что если я закомментирую вызов этой функции, программа загрузится за секунды. При вызове функции это занимает 5 минут. Почти точно. Я действительно в тупике. В чем может быть проблема?

Вот PathTable , который он использует.

РЕДАКТИРОВАТЬ - Я попытался запустить функцию в программе отдельно, это заняло несколько секунд, но, боюсь, я не знаю достаточно, чтобы узнать, как решить эту проблему. Очевидно, это не код. Что бы это могло быть? Я проверил, откуда ему звонят, чтобы узнать, было ли несколько звонков, но их нет. Он находится в конструкторе уровня игры и вызывается только один раз.

РЕДАКТИРОВАТЬ - Я понимаю, что код не самый лучший, но дело не в этом. Он работает быстро сам по себе - около 3 секунд, и это меня устраивает. Проблема, которую я пытаюсь решить, заключается в том, почему внутри проекта требуется гораздо больше времени.

РЕДАКТИРОВАТЬ - Я закомментировал весь игровой код, кроме основного игрового цикла. Я поместил метод в раздел инициализации кода, который запускается один раз при запуске.За исключением нескольких методов настройки окна, теперь оно почти такое же, как программа с ТОЛЬКО методом, только для ее запуска ВСЕ ЕЩЕ требуется около 5 минут. Теперь я знаю, что это не имеет ничего общего с зависимостями от pathLookupVectors. Кроме того, я знаю, что компьютер начинает писать на жесткий диск не из-за памяти, потому что, пока медленная программа не запускает метод, я могу открыть другой экземпляр Visual Studio и одновременно запустить программу с одним методом, что завершает в секундах. Я понимаю, что проблема может заключаться в некоторых основных настройках, но у меня нет опыта, поэтому извиняюсь, если это, к сожалению, стало причиной того, почему. Я до сих пор не понимаю, почему это занимает так много времени.

10
задан Peter Mortensen 5 September 2015 в 09:35
поделиться