【问题标题】:C++ Programs slowing down over iterations [duplicate]C ++程序在迭代中减慢[重复]
【发布时间】:2019-05-20 13:08:21
【问题描述】:

我正在编写 c++ 程序来构造分子并对它们执行矢量运算。为了获得某个特定问题的概率,我必须进行多次随机观察并计算比率。 当我获得 1000 个结果时,我的程序运行良好,但当我获得 10000 个结果时(远远超过 10 倍时间),我的程序几乎永远卡住了。电脑也变得反应迟钝。 因此,为了找出问题所在,经过一些调试后,我得出了以下结论: (我的矢量旋转算法) `

int main()
{
    Vector v1(3,4,0);
    geom3D::EulerAngle EA(90,0,0);
    int K=120000;
    for(int i=0;i<K;i++) 
    {
            v1=rotateVector(v1,EA);
            if(i%3000==0)
                cout << i << "\n";
    }
    cout << "Done\n";
}

它应该打印 3000,6000 ...我希望它会定期打印,但是,我在这里也遇到了同样的问题: 到了 51000,它打印得很快,然后计算机再次变得无响应。 我的猜测是它与内存分配有关,它在 rotateVector() 中分配了大量内存,但它没有释放,所以我尝试尽可能添加删除语句。但是我仍然找不到一个好的解决方案。 这样的行为正常吗?有解决办法吗?另外,删除语句是我能做的所有事情来释放内存吗?

【问题讨论】:

  • “尽可能地添加删除语句”在我看来绝对是一种“喷洒和祈祷”的方法......当不再需要内存时释放内存,而不是随意释放,并在事后编写清理代码是内存泄漏的秘诀。此外,如果您正在处理数组,为什么要使用原始newdelete 而不是std::vector?最重要的是,鉴于您说问题很可能在rotateVector,您为什么不发布?
  • 是的,您可能有内存泄漏。要真正解决这个问题(而不是仅仅放入删除语句并希望最好),您通常希望使用 RAII,因此您创建的对象在创建时分配必要的数据,并在销毁时释放它。为了至少更好地了解您是否正在查看内存泄漏,您可能需要观察程序随时间的内存消耗。如果它不断上升,这是泄漏的好兆头(尽管并非所有泄漏都可以通过这种方式轻松观察到)。
  • 你需要一台量子计算机...
  • 我所说的“我能做到的地方”,是指之后不再需要该对象的地方。不过感谢您的指点。会进去看看
  • 假设您的算法(或内存泄漏)不会导致您的计算机耗尽 RAM 并开始交换(这肯定会大大减慢速度),另一种解释是您正在运行一种具有大于线性缩放行为的算法。尤其是 O(N^2) 算法,因其在小问题规模上表现良好而臭名昭著,然后随着问题规模变大而迅速恶化为难以处理的问题。你应该在分析器下运行你的程序,看看它把时间花在了哪里,然后看看你是否可以重写该算法以提高效率。

标签: c++ memory


【解决方案1】:

您发现您的计算机资源受到限制。这是正常的。尽管计算机似乎可以正常使用,但它们的功能确实有限制。正因为如此,有时你必须找到一种创造性的方法来限制你的程序,通过限制迭代次数甚至数字的长度。有时这必须在用户输入和输入时完成,从而限制可能的输入。为了进一步说明,我有两个例子,从我自己的经验来看,它们会因重复次数过多而导致速度减慢。第一个例子:创建一个 Excel 文件并在一个单元格中输入随机数函数。水平复制单元格 10000 个单元格。然后将整行复制 10000 行。按 F9 重新计算。第二个示例:创建一个 Adob​​e Illustrator 文件。创建一个包含多个向量的矢量图形。复制并粘贴图形 10000 次。保存并关闭项目。重新打开项目。

【讨论】:

  • 您在胡乱猜测,证据不足,无法支持您得出的结论。有可能你是对的——但我觉得它相当可疑。
  • 我没有“达到极限”(我希望如此)。我一遍又一遍地替换同一个向量。它不能再占一个 Vector 对象了,对吧?
  • 这不是一个疯狂的猜测。如果有的话,它缺乏技术解释。 OP 和评论员提出了内存问题。过度使用这些资源时计算机变慢是很正常的。我主要是在回答 OP 的问题是否正常,并提供其他大量计算减慢速度的示例。
  • @Sreyas Adury 我指的是 for 循环,随着答案和计算变得越来越大,计算机必须更加努力地工作才能得到答案
  • @SreyasAdury 抱歉,我无法更好地解释,我只是建议有时计算机无法处理大量计算。你正在使用分子……这就是为什么人们如此努力地完善量子计算机……用分子执行复杂的计算……等等。有时接受并可能将“int K”设置为较小的数字。
猜你喜欢
  • 1970-01-01
  • 2018-03-15
  • 2018-10-24
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多