Итак, я работал с параллельными коллекциями в Scala для графического проекта, над которым я работаю, у меня определены основы класса графа, в настоящее время он использует scala.collection.mutable.HashMap
, где ключом является * 1002.* и значение 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 ++ обработана305 570 пар за промежуток времени, равный примерно 3 дням, в то время как версия Scala обработала только 23 573 за 17 часов.
При условии, что я правильно выполнил math , однопоточная версия C ++примерно в 3 раза быстрее, чем версия Scala. Действительно ли Scala намного медленнее, чем C ++, или я совершенно неправильно использую Scala (я только недавно начал - у меня около 300 страниц по программированию в 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 для всего, есть ли эквивалент.par.foreach
какое-то время?
РЕДАКТИРОВАТЬ2 Подождите секунду, этот код даже не прав - мой плохой.Как бы я распараллелить это, используя циклы while?Если у меня есть var i
, который отслеживает итерацию, то не все ли потоки будут делиться этим i
?