2011-12-07 16 views
3

对于图的并行处理,如最短路径计算,斯卡拉将胜过C++吗?如果不是,它会变慢多少(我假设Scala并发比C++更容易编写,因为C++没有标准支持这种东西)斯卡拉与C++的分布式图处理

我正在考虑学习Scala,学习一种新的语言,因为它似乎有很好的并发支持。一旦我完成了,我正在考虑编写一个分布式图形库来练习Scala,并为我自己使用,但是如果C++将会更快,并且更容易编写代码的好处不值得在性能是担心,我不得不重新思考这个任务。

+3

“语言没有速度,实现方式。”话虽如此,C++的运行明显比Scala更“裸机”。这很重要吗?它取决于算法/方法以及什么形式的并行处理(线程/ GPU/MPI/actors /等),什么库(和环境!)以及瓶颈实现和开发人员的熟练程度等等。 ..既然你说“考虑学习斯卡拉”,那么**是的,无论如何,要做到这一点**。 “最糟糕的是”你会学到一些新的方法/概念。当然,也许为此应该探索Haskell? ;-) – 2011-12-07 05:26:08

+2

就C++中“缺少”并发处理而言,请考虑[Charm ++](http://charm.cs.uiuc.edu/)哦......您知道......在100k +内核上进行并行处理。 (即使“不是C++规范/标准库的一部分”,也有许多从基本线程到非线程的并行库/运行库)。 – 2011-12-07 05:32:04

+0

还有C++的boost :: graph库。 – GWW

回答

13

我建议斯卡拉过C++,原因如下:

  • 并发 - 就像你说的,有在JVM上大并发支持和Scala是从中受益的好语言。这并不是说你不能用C++编写并发代码,但你会发现在Scala中“开箱即用”更容易。
  • 垃圾回收 - 很多图算法从垃圾回收与其他内存管理方法中获益显着。再说一遍,JVM上的垃圾回收非常好(在C++世界中,优于任何东西),并且会使您的算法更容易编写。
  • JIT编译器的质量 - 对于遍历堆内存中的对象图,我怀疑好的C++代码和JVM JIT产生的代码之间会有明显的性能差异。 JVM针对这种用法进行了相当多的优化。

当然,也可能在C写极高性能的代码++。在某些情况下,手动调整的C/C++代码可以胜过JIT(例如,当您可以证明它们不需要时,避免需要数组边界检查或空指针检查)。或者你可以编写自己的专门用于图形处理的内存分配器,理论上它可能会胜过JVM中的通用垃圾收集器(尽管如果你想试试这个,你最好是一个真正的天才....)

总的来说,使用C++编写所有内容将会复杂得多,而且理论上可以实现的边际性能改进几乎肯定不值得。

+2

它并不难编写出来执行java的C++,你是专门为单一的体系结构。这就是如此接近金属手段。它只是不值得一般的努力。 – wheaties

+2

你也可以考虑D(http://www.d-programming-language.org/)。它编译为本地代码,如C/C++,具有并发功能和垃圾收集。 –

+2

boost和现代C++方法照顾所有这些原因。但斯卡拉绝对更直观,需要更少的经验。 –