被gprof输出弄糊涂了——调用太多
Confused by gprof output -- too many calls?
我刚刚开始使用gprof来优化我的慢代码。我被一个输出弄糊涂了,希望你能帮助我。
在这里:
0.01 0.46 500/500 System::Update() [2]
[3] 96.2 0.01 0.46 500 Verlet::Advance() [3]
0.02 0.19 61000/61122 CalculateAcceleration(std::vector<Particle, std::allocator<Particle> > const&, int) [4]
0.00 0.06 183000/244127 Vector3D::Vector3D() [8]
0.00 0.06 305000/676956 Vector3D::Vector3D(Vector3D const&) [6]
0.00 0.03 122000/122000 Particle::SetPosition(Vector3D const&) [18]
0.00 0.03 122000/122000 Particle::SetVelocity(Vector3D const&) [19]
0.02 0.01 183000/183000 Vector3D::LinearCombine(double, Vector3D, double) [23]
0.00 0.03 549000/921083 Vector3D::~Vector3D() [14]
0.00 0.00 122000/364484 Vector3D::AddToVector(Vector3D) [30]
0.00 0.00 61000/182242 std::pow(double, int) [44]
0.00 0.00 61000/303484 Vector3D::ScalarMultVector(double) [51]
0.00 0.00 61500/7579826 std::vector<Particle, std::allocator<Particle> >::size() const [25]
0.00 0.00 366000/366122 std::vector<Particle, std::allocator<Particle> >::operator[](unsigned int) [127]
0.00 0.00 122000/365606 Particle::GetPosition() const [128]
我运行这个函数500次,而for循环的大小是122,所以61,000对应于每次运行执行一次,122,000到2,183,000到3,244,000到4和305,000到5。下面是循环:
void Advance() {
for(int i = 0; i < (int)Particles.size(); i++) {
const Vector3D& CurrentR_NMinus1 = Particles[i].GetPosition();
const Vector3D& CurrentR_N = Particles1[i].GetPosition();
const Vector3D& CurrentA_N = CalculateAcceleration(Particles1,i);
// Calculate R_N+1
Vector3D CurrentR_NPlus1;
CurrentR_NPlus1.AddToVector(CurrentR_N);
CurrentR_NPlus1.LinearCombine(2, CurrentR_NMinus1, -1);
CurrentR_NPlus1.LinearCombine(1, CurrentA_N, pow(StepSize,2));
// Calculate V_N
Vector3D CurrentV_N;
CurrentV_N.AddToVector(CurrentR_NPlus1);
CurrentV_N.LinearCombine(1,CurrentR_NMinus1,-1);
CurrentV_N.ScalarMultVector(1/(2*StepSize));
// Update
Particles[i].SetPosition(CurrentR_N);
Particles[i].SetVelocity(CurrentV_N);
t0 += StepSize;
Particles1[i].SetPosition(CurrentR_NPlus1);
Particles1[i].SetVelocity(Vector3D());
t1 += StepSize;
}
}
所有条目对我来说都是有意义的,除了一个:Vector3D(Vector3D const&)显然被调用了5次。但是代码里没有!它的孩子当然叫它,但我认为他们在gprof列表中有自己的条目。我的想法有什么缺陷?它是否与粒子[]是Vector3Ds的矢量有关?
很抱歉,如果这是一个明显的问题——我只是刚刚开始使用gprof,我也是一个c++新手。我还没能在网上找到答案,但是,所以我希望你能帮助我。
非常感谢您的时间!
这是Vector3D类类型对象的copy constructor
。隐式调用复制构造函数的一种情况是,将现有实例按值作为参数传递给函数。我的猜测是,这发生在对AddToVector
、SetPosition
和SetVelocity
的调用中,正如我在下面的评论中指出的那样,总共有5个调用。你可能很好奇为什么当你调用SetVelocity(Vector3D())时不调用copy constructor
,这是最好的解释,如果你想知道,通过阅读这里的解释:
正确使用右值引用作为形参
const Vector3D& CurrentR_NMinus1 = Particles[i].GetPosition();
const Vector3D& CurrentR_N = Particles1[i].GetPosition();
const Vector3D& CurrentA_N = CalculateAcceleration(Particles1,i);
// Calculate R_N+1
Vector3D CurrentR_NPlus1;
CurrentR_NPlus1.AddToVector(CurrentR_N); // copy constructor called
CurrentR_NPlus1.LinearCombine(2, CurrentR_NMinus1, -1);
CurrentR_NPlus1.LinearCombine(1, CurrentA_N, pow(StepSize,2));
// Calculate V_N
Vector3D CurrentV_N;
CurrentV_N.AddToVector(CurrentR_NPlus1); // copy constructor called
CurrentV_N.LinearCombine(1,CurrentR_NMinus1,-1);
CurrentV_N.ScalarMultVector(1/(2*StepSize));
// Update
Particles[i].SetPosition(CurrentR_N); // copy constructor called
Particles[i].SetVelocity(CurrentV_N); // copy constructor called
t0 += StepSize;
Particles1[i].SetPosition(CurrentR_NPlus1); // copy constructor called
Particles1[i].SetVelocity(Vector3D());
t1 += StepSize;
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 错误:字符数组的初始值设定项太多
- 对象实例化调用构造函数的次数太多
- Levenshtein 两个文件的距离花费了太多时间
- 我有三个 getline,但是一旦编译,输入就太多了
- 将使用太多的纹理插值器 - 带旋转的着色器
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- C++:数组<>初始值设定项太多
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 调用宏时参数太多
- 在功能调用中免费结构太多参数
- 函数调用的参数太多,预期为 0,有 1。 "InfInt.h"字符串函数
- 问题:太多的setText调用会导致滞后
- 函数调用运算符重载的参数太多
- 调试转储文件调用堆栈没有太多信息
- 被gprof输出弄糊涂了——调用太多
- 在销毁期间使用std::shared_ptr发生段故障,可能是由于堆栈上的函数调用太多
- 为类函数宏调用提供的参数太多