Scala在数字处理和重字符串处理方面是否比Java7快?

Scala在数字处理和重字符串处理方面是否比Java7快?,scala,java-7,Scala,Java 7,假设有两类应用程序: (1) 密集的数字运算、数值计算和数学计算 (2) 密集的字符串正则表达式匹配、xpath搜索和其他字符串操作,其中字符串主要存储在集合类中 在这两种情况下,假设客户端每秒访问这些应用程序数千次,甚至并行访问 因此,如果我可以选择在服务器后端实现应用程序,我可以选择Java7或Scala。我应该选择哪一个来获得更快的性能和更可靠的代码?谷歌最近做了一些基准测试,您可能会觉得有趣-请参阅链接到此处的文章: 这篇论文出人意料地不科学,但你会对能做什么有一个粗略的感觉。特别值得关

假设有两类应用程序:

(1) 密集的数字运算、数值计算和数学计算

(2) 密集的字符串正则表达式匹配、xpath搜索和其他字符串操作,其中字符串主要存储在集合类中

在这两种情况下,假设客户端每秒访问这些应用程序数千次,甚至并行访问


因此,如果我可以选择在服务器后端实现应用程序,我可以选择Java7或Scala。我应该选择哪一个来获得更快的性能和更可靠的代码?

谷歌最近做了一些基准测试,您可能会觉得有趣-请参阅链接到此处的文章:

这篇论文出人意料地不科学,但你会对能做什么有一个粗略的感觉。特别值得关注的可能是第V.F节

Daniel Mahler通过创建 更多功能版本,保存在Scala Pro中 目录。这个版本只有270行代码,大约25% 对于C++版本,它不仅更短,而且运行时也 提高了大约3倍。应该注意的是,此版本 同时执行算法改进,因此 与其他Pro版本没有直接可比性

我不清楚这个有算法改进的版本是否包含在他们的速度基准表中(我不这么认为),但它确实表明,您可以通过采用算法改进来提高性能,而在Scala中实现算法改进更可行。然而,对于简单的字符串处理来说,它并没有多大用处


一个重要因素将是您在编程这些语言方面的能力,以及您在优化它们方面的能力。Java显然更加冗长,但您不太可能遇到性能“问题”。

根据您的专业知识和努力,我希望您可以在这里或那里获得更好的结果。通常,只要投入无限的开发时间和资金,您就可以改进、改进和改进每种语言的代码。(想想越来越大的缓存、专门的分类器、预计算的默认值等等)


由于对两种语言都有很好的理解,并且在您所在领域的性能问题上有一定的经验,我不希望有太大的差异,但您可以通过更易于收集的scala方法节省一些时间,并且在正常开发上节省的时间可以用于性能分析和改进

在数值计算方面,有两点可能比Java中的性能更好:

  • 实用的一个:Scala使并行计算“令人尴尬的并行”问题变得非常容易。虽然同样的事情也可以在Java中完成,但这需要更多的时间和专业知识,因此很可能只有在极少数情况下才能完成

  • 技术上的一个:Scala可以专门化基本类型的通用数据结构,使得装箱/拆箱变得不必要。Java编译器无法做到这一点


Scala使用Java的字符串,因此这里可能的改进数量非常有限。但也有其他数据结构,如rope,在某些情况下比String提供更好的性能。

对于数字运算应用程序,Scala比Java更快,原则上没有真正的理由

如果我想编写一个高性能的数字处理应用程序,我不会选择Java、Scala或任何其他JVM语言


从我自己的角度来看(当然,这只是轶事证据,绝对不能证明这在所有情况下都是正确的),JVM并不是最适合进行大量数字运算的平台。如果原始数字的计算速度很重要,你可能会更接近于“金属”的东西,比如C++,这样你就可以使用英特尔SSE指令,做其他低级优化,如果您的算法适合,也可以使用GPU。

除非有人在这些任务上对这些语言进行了客观比较,否则您可能会在这里得到主观的答案。为什么scala应该更快?(它们都在JVM上运行,所以当您有差异时,它们可能会很小)我能看到Scala的唯一方法是更快,以防Scala使用更好的数据结构。Scala可以使用专门化,这消除了在使用通用数据结构时装箱/取消装箱原语的需要。其他地方推测的另一个因素是Scala默认强调不可变对象。因此,它大大简化了GC评估对象实例的“活动性”所必须做的工作。将超级简单的并行计算与显著减少的GC周期结合起来,Scala实现不需要花太多时间就能超越Java获得更高的性能。不幸的是,专业化在实践中并没有很好地工作(目前),因为标准Scala库中专门化的东西太少。