ですから、私が取り組んでいるグラフプロジェクトのために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でプログラミングを始めたばかりです)。
ありがとう!-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ループを使用するという意味の場合、whileに相当するものはあり.par.foreachますか?
EDIT2ちょっと待ってください、そのコードは正しくありません-私の悪いです。whileループを使用してこれを並列化するにはどうすればよいですか?var i反復を追跡するものがある場合、すべてのスレッドがそれを共有しているのではないでしょiうか?