我有一些用c ++编写的代码,这是一个简单的程序,可以找到具有3000多个顶点的图形的成对dmin。所有边都具有相同的权重1.所以我在所有顶点对上做BFS。
我的程序运行速度不够快,所以我使用Xcode 4.2.1的product->配置文件对我的代码进行了分析。 它称为“乐器”工具。过了一会儿,我想出了如何使用它。但我得到的是非常混乱。突出显示的行如何使用这么多时间?任何想法都受到高度赞赏。
我定义了: 矢量访问; 矢量<矢量> G; //邻接列表
答案 0 :(得分:1)
仪器运行告诉你,[G [n] [i]]访问的绝大多数时间都是真的。
答案 1 :(得分:1)
声明中的绝大部分时间:(visited[G[n][i]] == false)
将导致大量缓存未命中。
请注意G
是一个3k * 3k的大矩阵,占用连续的虚拟内存空间,而visited
是另一个3k阵列,在另一个位置占用另一个连续内存在虚拟内存空间。根据处理器缓存的容量,访问同一语句中的两个内存位置将导致大量缓存未命中。
要获得加速,请记住locality of reference重写程序。