我目前正在分析用Scala编写的应用程序的性能,我想知道是否可以使用功能构造.一方面,我喜欢功能性编程的优雅和简洁,另一方面,我害怕最终的表现.我发现了一个特别好的例子.
我有一个包含一百万个字符的字符串,我需要对每个数字求和.典型的功能方法是这样的:
val sum = value.map(_.asDigit).sum.toString
Run Code Online (Sandbox Code Playgroud)
然而,这种美观,简洁,功能性的方法需要0.98秒(几乎一秒钟)
var sum = 0;
for(digit <- value)
sum += digit.asDigit
Run Code Online (Sandbox Code Playgroud)
另一方面,这种必要的方法仅需0.022秒(上述时间的2.24%) - 速度提高约50倍......
我确信问题出现了,因为Scala在第一种方法中生成一个新列表,然后再次迭代该列表以创建总和.
依靠功能结构是一个坏主意吗?我的意思是,它们很美 - 我爱它们 - 但它们慢了50倍......
PS我也尝试了别的东西.
val sum = value.foldLeft(0)((sum, value) => sum + value.asDigit)
Run Code Online (Sandbox Code Playgroud)
这种功能性方法虽然简洁,可能比命令式方法更难阅读,但需要0.085秒.它更难阅读,仍然慢4倍......
scala ×1