【问题标题】:Performance of vectors in loops in c++c++中循环向量的性能
【发布时间】:2013-10-04 23:39:55
【问题描述】:

我有一个 100,000 次迭代的 for 循环 - 每次迭代都涉及一些对象位置的简单距离计算。这都是复杂碰撞检测机制的一部分。

现在太多不必要的迭代效率不高,并且会减慢程序的速度。我想通过使用排序向量来减少计算时间。

因此,或者我想通过将引用元素插入到根据“网格”对位置进行排序的二维向量中来将迭代次数降至最低。而不是 100,000 次迭代,我可能只有 1000 次迭代具有相同的计算,但现在只涉及特定的“部门”。然而,不利的一面可能是,每当对象改变其位置时,需要使用 push_back 和擦除定期使用对象网格或扇区位置更新 2D 矢量。

我的问题是关于性能而不是代码。使用 erase 和 push_back 更新向量是否比使用暴力尝试迭代更快?我只需要粗略估计一下是否值得追求这个想法。谢谢。

【问题讨论】:

  • 两者都编码,基准测试。 (老实说,从您的无代码描述中并不清楚您实际上在做什么,这使得您很难进行理论分析。)
  • 是的,我想我必须这样做。我只是想知道是否有一般规则。该循环是一个简单的循环计算一个对象的位置和另一个被迭代的位置之间的距离。该向量将涉及这些位置的排序列表,可用于为迭代设置边界。但我想你是对的,对它进行基准测试是确定的唯一方法。谢谢。
  • 嗯,一般规则是做复杂性分析,因为他们在算法课上教你。这几乎总是用伪代码解释,正如我所说,在散文描述中真的不容易做到。 (因为你想看看哪个操作重复了多少次,它的内部复杂度是多少。)
  • 是的,如果没有一些代码可以说,这真的很难说,但这里有一些需要考虑的东西:(1) branch predition 如果你排序可能会对你有很大帮助,(2)对数组进行排序可能需要很长时间,(3) 听起来您正在复制到另一个数组中,这会增加您的空间复杂度。
  • 我想我只是这样做并发布结果......

标签: loops vector


【解决方案1】:

您正在寻找的是binary space partitioning。这种方式对于任何给定的对象,找到一个碰撞对象是 O(log N),其中 N 是对象的数量。这应该会将您的碰撞检测成本从 O(N2) 降低到 O(N log N)。

【讨论】:

    【解决方案2】:

    如果您在主要是静态对象之间进行距离计算,您可以使用quadtrees 来减少检查次数。 如果很多物体都在移动,那么"loose quadtrees" 是更好的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2013-05-08
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多