我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?
最近,我注意到有些人提到它std::list::size()具有线性复杂性.
根据一些 消息来源,这实际上是依赖于实现的,因为标准没有说复杂性必须是什么.此博客条目中
的评论说:
实际上,这取决于您使用的STL.Microsoft Visual Studio V6将size()实现为{return(_Size); 而gcc(至少在版本3.3.2和4.1.0中)将其作为{return std :: distance(begin(),end()); 第一个具有恒定速度,第二个具有o(N)速度
size()复杂程度不变,因为自VC6以来Dinkumware可能不会改变这一事实.我在那儿吗?gcc什么?如果它真的是O(n),开发人员为什么选择这样做?我在我的项目中有一个方法,当它放入自己的程序时只需几秒钟就可以运行,当它在它所属的项目中运行时需要5分钟.我不知道为什么.我尝试过分析,取出比特,改变这一点.我很难过.
它填充了另一个类使用的整数向量,但此类目前尚未实例化.我尽可能多地检查,看起来确实没有其他事情发生,但是这个方法在一个项目中神奇地花费的时间比在另一个项目中花费的时间长.
该方法在启动时运行,大约需要5分钟,如果单独运行则需要大约3秒钟.可能是什么导致了这个?奇怪的项目设置?多线程的东西,我不知道?(据我所知,无论如何我的项目都没有,除非它是自动完成的).
还有就是该项目的链接在这里.如果有人能为我解决这个问题,我将非常感激,并且我能尽快为此开始赏金.
该方法称为PopulatePathVectors,并在Level.cpp中运行.注释掉对方法的调用(在关卡构造函数中)意味着程序在几秒钟内启动.使用它生成的列表的唯一其他类是代理,但目前没有实例化.
编辑 - 根据要求,这是代码.虽然请记住我的问题不是'为什么代码慢?' 但是"为什么它在一个地方快速而且在我的项目中变慢?"
//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));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑 …