Scala等语言与C/C++/Fortran之间的性能比较?

7

我想知道是否有可靠的性能比较,可以比较“现代”的多线程专用语言(例如scala)和“传统”的“低级”语言(如C、C++、Fortran),使用并行库如MPI、Posix甚至Open-MP。

欢迎提供任何链接和建议。


3
我认为绩效测量是与应用或领域相关的。一种编程语言可能在图形方面表现更好,而另一种则在搜索方面更胜一筹。请提供关于您将使用这些编程语言进行哪个项目或应用程序的更多信息。 - Thomas Matthews
当然,我已经尝试过谷歌了;-) 嗯,我只是好奇,没有特殊的应用。只是想知道与本地的C/C++/Fortran二进制文件相比,JVM是否会产生一些额外开销。现在的问题是:使用Scala等和JVM相比,何时开始有优势,与本地的C/C++/Fortran二进制文件相比?适当的基准测试设置当然是至关重要的。 - S.Tayefeh
1
JVM最佳情况是所有正常情况都已执行一次,以将它们编译成本机代码。而且Java并不是为速度而设计的。通常,可移植性和速度在设计表的相反侧面。 - Paul Nathan
请查看Parallel Colt项目(以及Piotr Wendykier的其他软件)。那里有很多快速的并行Java,尽管我很少见到通过MPI使用的惊人处理器数量。 - Rex Kerr
3个回答

4

考虑到Java和Scala可以调用外部库,而那些高度专业化的外部库将完成大部分工作,因此只要使用相同的库,性能就是相同的。

除此之外,任何这样的比较基本上都是毫无意义的。Scala代码运行在一个具有运行时优化的虚拟机上。该优化可以使长时间运行的程序比使用其他语言编译的程序更具性能——或者不是这样的。这取决于每种语言编写的具体程序。


1

这里有另一个不是答案的建议:去你当地的超级计算机中心,询问每种你感兴趣的语言所使用的CPU负载的比例。这只会给你一个代理答案,它会告诉你那些关注在这样的机器上高性能的人在解决他们所面对的问题时使用了什么。但这和其他任何你可能得到的答案一样具有启发性,因为这是一个非常广泛的问题。

附言:答案将是Fortran、C和C++消耗了超过95%的CPU周期。


-1

我认为这样的比较可以看作是一个分数。分子是一个常数(大约是0.00001)。分母是线程数乘以逻辑处理器数。

也就是说,对于单个线程,这种比较有一百万分之一的机会意味着什么。对于一个四核处理器运行具有(例如)16个线程的应用程序,你只有六千四百万分之一的机会得到有意义的结果。

简而言之,毫无疑问有很多人在研究它,但即使其中任何一个人提供了有用和有意义的结果,其概率仍然极低。更糟糕的是,即使其中一个真的有意义,要找到它几乎是不可能的,甚至更难以验证到你实际上“知道”它有意义。


可能有趣,但也是错误的。有很多好的方法来基准测试性能,MPI 的人们经常这样做,从延迟测量到随着处理器数量的增加效率的提高,再到对于众所周知的算法通信与计算的分解。这不是一个容易回答的问题,但如果你打算烧掉一百万小时的 CPU 时间,这类问题是可以回答的,并且非常值得知道答案。 - Rex Kerr
@Rex:是的,有很多方法可以对性能进行基准测试。你列出的问题类型甚至可以通过这些基准测试来回答——但他的问题不同于那些问题,也无法回答。你不能将Scala与Fortran进行比较——最多只能将一个特定的实现与另一个特定的实现进行比较。一个有意义的答案需要一个定义明确且通常相当狭窄的问题。他的问题定义不清楚,极其广泛,并且缺乏任何有意义的答案。 - Jerry Coffin
1
@Rex:这就是问题所在:你无法(即使原则上)回答组成答案的那些部分。例如,如果你发现使用Scala的实现X比使用Fortran的实现Y快10%,你只能推测你看到的差异是否真的与Scala vs. Fortran有关。下周,Y可能会升级为比X快20%--但无论它是否如此,它仍然告诉你与Scala vs. Fortran无关的信息。 - Jerry Coffin
@Jerry:这并不神秘。你可以在两种语言中编写相同的算法,对每个进行分析比较瓶颈。也许你需要调整其中一种语言以获得更好的性能。无论哪种方式,如果你很有能力,你都会得到很好的基本数据。然后只需调整任务以变化,例如通信量。再次测量即可。 - Rex Kerr
@Jerry:有兴趣从头开始编写Java + JVM的另一个版本吗?不?那么我认为具体的实现非常重要。你知道,每隔几周就推出新的C++并不能带来大幅提高的性能。这些东西相当稳定。 - Rex Kerr
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接