gpt4 book ai didi

c++ - 对 gprof 输出感到困惑——调用太多?

转载 作者:行者123 更新时间:2023-11-30 02:47:36 25 4
gpt4 key购买 nike

我刚刚开始使用 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 次。但它在代码中无处可寻!它的 child 当然会这样调用它,但我认为他们在 gprof 列表中有自己的条目。我的想法哪里出了问题?它与 Particles[] 是 Vector3D 的 vector 有关吗?

抱歉,如果这是一个明显的问题——我才刚刚开始使用 gprof,而且我也是 C++ 的新手。但是我无法在网上找到答案,所以我希望你能帮助我。

非常感谢您的宝贵时间!

最佳答案

这是 Vector3D 类对象的复制构造函数。隐式调用复制构造函数的一种情况是将现有实例按值作为参数传递给函数。我的猜测是在对 AddToVectorSetPositionSetVelocity 的调用中发生了这种情况,正如我在下面的评论中指出的那样,总共有 5 个调用.您可能好奇为什么在调用 SetVelocity(Vector3D()) 时不调用复制构造函数,如果您想知道,最好的解释是阅读此处的解释:

Correct usage of rvalue references as parameters

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;

关于c++ - 对 gprof 输出感到困惑——调用太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com