因此,我一直在为我正在处理的图形项目使用 Scala 中的并行集合,我已经定义了图形类的基础知识,它目前正在使用scala.collection.mutable.HashMap
键Int
和值的位置ListBuffer[Int]
(邻接列表) . (编辑:这已更改为ArrayBuffer[Int]
几个月前我在 C++ 中做过类似的事情,使用std::vector<int, std::vector<int> >
.
我现在要做的是在图中的所有顶点对之间运行一个度量,所以在 C++ 中我做了这样的事情:
// myVec = std::vector<int> of vertices
for (std::vector<int>::iterator iter = myVec.begin(); iter != myVec.end(); ++iter) {
for (std::vector<int>::iterator iter2 = myVec.begin();
iter2 != myVec.end(); ++iter2) {
/* Run algorithm between *iter and *iter2 */
}
}
我在 Scala 中做了同样的事情,并行化,(或试图)这样做:
// vertexList is a List[Int] (NOW CHANGED TO Array[Int] - see below)
vertexList.par.foreach(u =>
vertexList.foreach(v =>
/* Run algorithm between u and v */
)
)
C++ 版本显然是单线程的,Scala 版本.par
因此使用并行集合并且在 8 个内核(同一台机器)上是多线程的。然而,C++ 版本在大约 3 天内处理了 305,570 对,而 Scala 版本迄今为止仅在 17 小时内处理了 23,573 对。
假设我的数学计算正确,单线程 C++ 版本比 Scala 版本快大约 3 倍。Scala 真的比 C++ 慢得多,还是我完全误用了 Scala(我最近才开始使用 Scala 编程大约有 300 页)?
谢谢!-kstruct
编辑要使用 while 循环,我会做类似的事情吗?
// Where vertexList is an Array[Int]
vertexList.par.foreach(u =>
while (i <- 0 until vertexList.length) {
/* Run algorithm between u and vertexList(i) */
}
}
如果你们的意思是对整个事情使用while循环,那么是否有相当于.par.foreach
for while的?
EDIT2等一下,那个代码甚至都不对——我的错。我将如何使用 while 循环并行化它?如果我有一些var i
跟踪迭代,那么不是所有线程都在共享它i
吗?