Я преобразовал этот простой метод из 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 и одновременно запустить программу с одним методом, что завершает в секундах. Я понимаю, что проблема может заключаться в некоторых основных настройках, но у меня нет опыта, поэтому извиняюсь, если это, к сожалению, стало причиной того, почему. Я до сих пор не понимаю, почему это занимает так много времени.