向量<;向量<;int>&燃气轮机;初始化时间太长 我有C++编写的代码,它是一个简单的程序,用于找出一个具有3000个顶点的图的成对Dmin。所有边都具有相同的权重1。所以我在所有的顶点对上做BFS

向量<;向量<;int>&燃气轮机;初始化时间太长 我有C++编写的代码,它是一个简单的程序,用于找出一个具有3000个顶点的图的成对Dmin。所有边都具有相同的权重1。所以我在所有的顶点对上做BFS,c++,stdvector,C++,Stdvector,我的程序运行速度不够快,所以我使用Xcode 4.2.1的product->profile对代码进行了评测。 它称一种工具为“仪器”。过了一会儿,我想出了如何使用它。但我得到的是非常混乱的。高亮显示的行怎么会占用这么多时间?任何想法都是值得赞赏的 我定义: 访问的病媒; 向量G//邻接表 运行的仪器告诉您,访问[G[n][i]]的绝大多数时间是真实的。语句中花费的绝大多数时间:(访问[G[n][i]==false)将由大量缓存未命中引起 请注意,G是一个大3k*3k矩阵,占用一个连续的虚拟内存空

我的程序运行速度不够快,所以我使用Xcode 4.2.1的product->profile对代码进行了评测。 它称一种工具为“仪器”。过了一会儿,我想出了如何使用它。但我得到的是非常混乱的。高亮显示的行怎么会占用这么多时间?任何想法都是值得赞赏的

我定义: 访问的病媒; 向量G//邻接表

运行的仪器告诉您,访问[G[n][i]]的绝大多数时间是真实的。

语句中花费的绝大多数时间:
(访问[G[n][i]==false)
将由大量缓存未命中引起

请注意,
G
是一个大3k*3k矩阵,占用一个连续的虚拟内存空间,
是另一个3k数组,占用虚拟内存空间中不同位置的另一个连续内存。访问同一语句中的两个内存位置将导致大量缓存未命中,具体取决于处理器缓存的容量


要获得加速,请牢记重写程序。

是否完成?它可能是一个无限循环?你有3000多个顶点。出于好奇,有多少条边?@ColeJohnson,是的,它完成了。@WhozCraig,这是一个稀疏图,所以边的数量大约是顶点数量的3倍。重要的是:在将对象添加到队列中时将其标记为已访问,而不是取出时。次要的事情:你可以把
std::vector&vertex=G[n]
从for循环中去掉。我没有意识到仪器是这样计数的。。。这是有道理的。好的观点,这是有道理的。你能举例说明我如何使(访问[G[n][I]]==false)遵循引用的位置吗?@user2883918,正如你在之前的评论中提到的,你正在考虑将G[n]从循环中分解出来。这将有一点帮助,取决于您的机器。对于较小的机器,当“访问”与“G”组合在一起时,将获得主要优势。也就是说,当G表示为所有节点的向量时,其中每个节点都有一个邻接列表以及一个布尔“已访问”变量。如果您有多维数组且存在缓存问题,请尝试交换,这样还可以自定义维度的存储顺序,因此,您可以尝试获得最佳性能。