首先,我想明确指出,这不是确定哪种语言更好的语言-X-语言-Y的问题。
我已经使用Java很长时间了,我打算继续使用它。与此并行的是,我目前对Scala的学习非常感兴趣:除了一些让我印象深刻的小事情之外,我真的可以很好地使用这种语言。
我的问题是:在执行速度和内存消耗方面,用Scala编写的软件与用Java编写的软件相比如何?当然,通常这是一个很难回答的问题,但是我希望模式匹配,高阶函数等更高层次的结构会带来一些开销。
但是,我目前在Scala的经验仅限于50行以下代码的小示例,并且到目前为止,我还没有运行任何基准测试。因此,我没有真实数据。
如果事实证明Scala 在 Java上确实有一些开销,那么混合使用Scala / Java项目是否有意义,在该项目中,Scala中的较复杂部分和Java中的性能关键部分都可以编码?这是常见的做法吗?
编辑1
我运行了一个小型基准测试:构建一个整数列表,将每个整数乘以2并将其放入新列表中,然后打印结果列表。我编写了一个Java实现(Java 6)和一个Scala实现(Scala 2.9)。我已经在Ubuntu 10.04下的Eclipse Indigo上都运行了。
结果是可比的:Java 480 ms,Scala 493 ms(平均100次迭代)。这是我使用过的片段。
// Java
public static void main(String[] args)
{
long total = 0;
final int maxCount = 100;
for (int count = 0; count < maxCount; count++)
{
final long t1 = System.currentTimeMillis();
final int max = 20000;
final List<Integer> list = new ArrayList<Integer>();
for (int index = 1; index <= max; index++)
{
list.add(index);
}
final List<Integer> doub = new ArrayList<Integer>();
for (Integer value : list)
{
doub.add(value * 2);
}
for (Integer value : doub)
{
System.out.println(value);
}
final long t2 = System.currentTimeMillis();
System.out.println("Elapsed milliseconds: " + (t2 - t1));
total += t2 - t1;
}
System.out.println("Average milliseconds: " + (total / maxCount));
}
// Scala
def main(args: Array[String])
{
var total: Long = 0
val maxCount = 100
for (i <- 1 to maxCount)
{
val t1 = System.currentTimeMillis()
val list = (1 to 20000) toList
val doub = list map { n: Int => 2 * n }
doub foreach ( println )
val t2 = System.currentTimeMillis()
println("Elapsed milliseconds: " + (t2 - t1))
total = total + (t2 - t1)
}
println("Average milliseconds: " + (total / maxCount))
}
因此,在这种情况下,Scala开销(使用范围,地图,lambda)似乎确实很小,与世界工程师提供的信息相距不远。
也许还有其他Scala构造应该谨慎使用,因为它们执行起来特别繁重?
编辑2
你们中有些人指出,内部循环中的println占用了大部分执行时间。我删除了它们,并将列表的大小设置为100000而不是20000。对于Java,结果平均为88毫秒,对于Scala为49毫秒。