Я преобразовал этот простой метод из С# в С++. Он читает таблицу путей и заполняет список списков ints (или вектор векторов ints).
Пример строки из таблицы путей будет похож на
0 12 5 16 n
Я понимаю, что есть лучшие способы сделать это в целом, но пока я просто хочу знать, почему мой код на С++ делает так намного дольше. например 10 минут, в отличие от 10 секунд с версией С#. Вот мой код на С++. Я предполагаю, что я сделал что-то немного радикально неправильно.
//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();
}
Вот версия С#:
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<List<int>>());
for (int j = 0; j < nodes.Count; j++)
{
string str = streamReader.ReadLine();
pathLookupLists[i].Add(new List<int>());
//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();
}
Извините, это так специфично, но я в тупике.
EDIT. Многие люди сказали, что они протестировали этот код, и для них требуется всего несколько секунд. Все, что я знаю, если я прокомментирую вызов этой функции, программа загружается за считанные секунды. При вызове функции требуется 5 минут. Почти точно. Я действительно в тупике. В чем проблема?
Вот PathTable, который он использует.
EDIT - я попробовал запустить функцию в программе самостоятельно, и это заняло несколько секунд, но я боюсь, что не знаю достаточно, чтобы узнать, как исправить эту проблему. Очевидно, это не код. Что бы это могло быть? Я проверил, где его вызывают, чтобы узнать, есть ли несколько вызовов, но нет. Он находится в конструкторе игрового уровня и вызывается только один раз.
EDIT - я понимаю, что код не самый лучший, как может быть, но здесь дело не в этом. Он работает быстро сам по себе - около 3 секунд, и это хорошо для меня. Проблема, которую я пытаюсь решить, - это то, почему в проекте требуется намного больше времени.
EDIT - я прокомментировал весь код игры, кроме основного игрового цикла. Я поместил этот метод в раздел инициализации кода, который запускается один раз при запуске. Помимо нескольких методов настройки окна, он теперь почти такой же, как и программа с ТОЛЬКО методом, только для STILL требуется около 5 минут для запуска. Теперь я знаю, что это не имеет никакого отношения к зависимостям от pathLookupVectors. Кроме того, я знаю, что это не память, когда компьютер начинает писать на жесткий диск, потому что в то время как медленная программа отлаживает запуск метода, я могу открыть еще один экземпляр Visual Studio и запустить программу с одним методом одновременно в секундах. Я понимаю, что проблема может быть в некоторых основных настройках, но я не испытываю таких извинений, если это разочаровывает в конечном итоге именно поэтому. Я до сих пор не знаю, почему это занимает гораздо больше времени.