(向量对)与(向量对)C++的速度[关闭]

Posted

技术标签:

【中文标题】(向量对)与(向量对)C++的速度[关闭]【英文标题】:speed of (vector of pairs) vs (pair of vectors) C++ [closed] 【发布时间】:2014-02-18 16:59:49 【问题描述】:

背景: 我已经完成了作为家庭作业编写的游戏。我们必须制作一个十六进制游戏。我决定使用 2d 节点向量来实现该板,并使用 2 个向量来跟踪节点邻居的 x 和 y 坐标。我用来确定获胜者的寻路算法与 Dijkstra 的相似。

我意识到使用 2 个向量的缺点是它们必须始终保持同步,但我问的是速度。我还意识到实现该板的更快方法可能是使用一维向量(我在完成程序的中途意识到这一点)。

问题:就原始速度而言,路径查找算法在使用 2 个向量来跟踪 (x,y) 时会运行得更快,还是如果我使用成对向量来实现,算法会运行得更快吗?

【问题讨论】:

这类问题最好通过一个小的自包含代码示例来回答,当您这样做时,您已经完成了构建自己的基准测试的 90%。 我过去做过类似的事情,而不是像(x, y)那样担心配对,我只是将配对转换为整数( x * Number_Of_rows + y),这就是我用来存储每个单独位置的董事会。邻居以类似的方式存储,每个节点将存储std::list<int> 的邻居 也许你喜欢阅读 ***.com/questions/7274268/… 虽然阅读量很大,但其实施的 boost 文档可以提供有关 Djikstra 的更多见解:boost.org/doc/libs/1_55_0/libs/graph/doc/… 无法回答:这取决于算法、数据量、内存管理... “我用来确定获胜者的寻路算法与 Dijkstra 的相似”不是为了提供不是“取决于”的答案而对代码的可接受描述。 【参考方案1】:

选择更适合您的需求。 在软件设计的这个阶段,您不应该关心性能。 更重要的是选择最适合您使用的数据结构。

这样做,您可能已经获得了性能优势。

【讨论】:

他说他已经完成了,在一个项目完成并且功能齐全之后,似乎是获得一些性能优势的最佳时机。此外,告诉他们不需要他们的问题的答案不是答案。 剖析是优化的最佳方式,也不是猜测或人们所说的微优化。 @user2581799:从这个答案中可能不明显的是用户是否真的预先考虑了设计。从这个问题来看,他似乎直到项目后期才考虑到成对向量的可能性。现在,aoeu 建议重新审视设计:您最适合使用哪种数据结构? 那应该是否。 1 设计的驱动力(我认为成对的向量可能更好)。您甚至可以说,对于这种特殊情况,您甚至根本不应该考虑性能(直到测量)【参考方案2】:

aoeu 说得对:首先要考虑好的表现。

其次,如果您担心游戏速度慢,请配置文件。找出有问题的区域并担心这些问题。

也就是说,有点关于速度:

顺序访问内存访问速度最快。跳来跳去是不好的。一个接一个地访问值是好的。

向量对(更一般地说,结构向量,VoS)或向量对(向量结构,SoV)是否更快的问题完全取决于您的访问模式。您是一起访问坐标对,还是先处理所有 x 值,然后处理所有 y 值?答案很可能会显示更快的数据布局。

也就是说,“最有可能”是指蹲下。简介,简介,简介。

【讨论】:

【参考方案3】:

我的直觉告诉我,成对的向量会更快,但您可能需要对其进行测试。创建一个测试程序,将几百万个点插入到格式和时间中,这样更快。然后是哪种格式更快地提取存储数据的时间。

【讨论】:

【参考方案4】:

首先,aoeu 很重要。

其次,关于一般优化:

优化的第一步是衡量,否则您没有基准来比较改进。

下一步是使用某种分析器来查看您的代码在哪里花费了周期/内存/其他,它可能不是您想的那样。

当您完成了这两个操作后,您就可以开始以正确的方式优化代码的正确部分了。

【讨论】:

【参考方案5】:

除了我的评论。如果随着游戏的进行,您的实现运行速度较慢(我猜是其中的 AI 部分),那么可能是因为您在每次移动后都在运行 Dijkstra。随着棋盘上的移动越多,游戏越大,AI 的性能就越差。

建议使用disjoint-set 方法而不是Dijkstra 来确定获胜者。 disjoint-set 相对于 Dijkstra 的优势在于它不仅使用更少的内存,而且它不会随着游戏的进行而变慢,因此您可以在每个玩家移动后运行它。 Disjoint-set - Wikipedia, Union-find - princeton

我意识到改变一个项目关键部分的实现是一项艰巨的任务,因为它几乎需要DO IT ALL OVER AGAIN,但这只是一个建议,如果你担心人工智能的速度,那么这个绝对值得研究。还有其他实现 AI 的方法,例如 minMAX tree、Alphabeta pruning(这是对 minmax 树的改进)

Gl.

【讨论】:

以上是关于(向量对)与(向量对)C++的速度[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

带有浮点索引的 C++ 数组/向量

在c ++中使用向量对数字进行排序[关闭]

如何使用 Quiver Plot 在向量场中显示速度大小?

C++ 如果我对一个向量进行排序,我怎样才能让另一个向量与该向量对齐? [复制]

C++ 向量问题

C++优化内存读取速度