Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (向量对)对(向量对)的速度C++;_C++_Performance_Vector_Dijkstra - Fatal编程技术网

C++ (向量对)对(向量对)的速度C++;

C++ (向量对)对(向量对)的速度C++;,c++,performance,vector,dijkstra,C++,Performance,Vector,Dijkstra,背景: 我已经完成了作为家庭作业的游戏。我们在那里玩了一个魔咒游戏。我决定使用节点的2d向量来实现电路板,并使用2个向量来跟踪节点邻居的x和y坐标。我用来确定胜利者的路径查找算法与Dijkstra的类似 我意识到使用2个向量的缺点是它们必须始终同步,但我想问的是速度。我还意识到,实现电路板的一种更快的方法可能是使用1d向量(我在完成程序的中途实现了该向量) 问题:就原始速度而言,使用2个向量跟踪(x,y)时,路径查找算法会运行得更快吗?或者如果使用成对向量实现,算法会运行得更快吗?选择更适合您需

背景:

我已经完成了作为家庭作业的游戏。我们在那里玩了一个魔咒游戏。我决定使用节点的2d向量来实现电路板,并使用2个向量来跟踪节点邻居的x和y坐标。我用来确定胜利者的路径查找算法与Dijkstra的类似

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


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

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


这样做,性能上的好处可能已经在你身上了。

我的直觉告诉我成对向量会更快,但你可能需要测试它。创建一个测试程序,在格式和时间中插入几百万个点,速度更快。然后再看看哪种格式提取存储的数据更快。

aoeu的做法是正确的:首先要考虑良好的表示

第二,如果你担心游戏速度太慢,那就请关注一下。找出有问题的地方并为之担忧

也就是说,关于速度:

按顺序访问内存的速度最快。到处乱跳是不好的。一个接一个地访问值是好的

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


也就是说,“很可能”的意思是蹲着。配置文件,配置文件,配置文件。

首先,aoeu已就位

第二,关于总体优化:

优化的第一步是度量,否则您就没有一个比较改进的基线

下一步是使用某种探查器来查看代码在哪里花费周期/内存/其他,它可能不是您认为的地方


完成这两项工作后,您可以开始以正确的方式优化代码的正确部分。

除了我的评论之外。如果您的实现随着游戏的进行而运行得较慢(我猜是AI的一部分),那么可能是因为您在每次移动之后都在运行Dijkstra。随着游戏越来越大,棋盘上的动作越来越多,人工智能的性能也越来越差

建议使用
不相交集
方法而不是
Dijkstra
方法来确定获胜者。与Dijkstra相比,
不相交集的优势在于,它不仅占用更少的内存,而且不会随着游戏的进行而变得更慢,因此您可以在每个玩家移动后运行它

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


Gl.

这类问题最好用一个小的自包含代码示例来回答,当您完成这项工作时,您已经完成了构建自己基准的90%。我过去做过类似的事情,而不是像
(x,y)中那样担心成对的问题
我只是将这些对转换成整数
(x*Number\u Of_rows+y)
这就是我用来存储电路板上每个单独位置的内容。邻居以类似的方式存储,每个节点将存储一个
std::list
邻居也许你喜欢阅读,尽管这是一个繁重的阅读过程,但是它们的实现的boost文档可以让你对Djikstra有更多的了解,特别是:不可能回答:这取决于算法、数据量、内存管理等等。。。“我用来确定胜利者的路径查找算法与Dijkstra的类似”对于提供答案的代码来说是不可接受的描述,而不是“视情况而定”他说他已经完成了,在一个项目完成并发挥功能之后,似乎是寻找一些性能优势的最佳时机。此外,告诉他们不需要回答他们的问题并不是一个答案。评测是优化的最佳方式,也不是猜测或人们称之为微优化的方式。@user2581799:从这个答案中可能不明显的是,用户是否真的提前想到了设计。从这个问题上看,他直到项目的晚期才考虑了一对成对的可能性。现在aoeu建议重新审视设计:您最适合使用哪种数据结构?这应该是设计的头号驱动力(我认为成对向量可能更好)。你甚至可以说,对于这个特殊的情况,你根本不应该考虑性能(直到测量)。