Trước hết tôi muốn làm rõ rằng đây không phải là câu hỏi ngôn ngữ-X-ngôn ngữ-Y để xác định câu nào tốt hơn.
Tôi đã sử dụng Java trong một thời gian dài và tôi dự định tiếp tục sử dụng nó. Song song với điều này, tôi hiện đang học Scala rất quan tâm: ngoài những điều nhỏ nhặt làm quen với ấn tượng của tôi là tôi thực sự có thể làm việc rất tốt trong ngôn ngữ này.
Câu hỏi của tôi là: làm thế nào để phần mềm được viết bằng Scala so với phần mềm được viết bằng Java về tốc độ thực thi và mức tiêu thụ bộ nhớ? Tất nhiên, đây là một câu hỏi khó trả lời nói chung, nhưng tôi mong đợi rằng các cấu trúc cấp cao hơn như khớp mẫu, các hàm bậc cao hơn, v.v., giới thiệu một số chi phí.
Tuy nhiên, trải nghiệm hiện tại của tôi về Scala chỉ giới hạn ở các ví dụ nhỏ dưới 50 dòng mã và tôi chưa chạy bất kỳ điểm chuẩn nào cho đến nay. Vì vậy, tôi không có dữ liệu thực sự.
Nếu hóa ra Scala có một số Java wrt trên đầu, thì có nghĩa là có các dự án Scala / Java hỗn hợp, trong đó một mã hóa các phần phức tạp hơn trong Scala và các phần quan trọng về hiệu năng trong Java? Đây có phải là một thực tế phổ biến?
CHỈNH SỬA 1
Tôi đã chạy một điểm chuẩn nhỏ: xây dựng một danh sách các số nguyên, nhân mỗi số nguyên với hai và đặt nó vào một danh sách mới, in danh sách kết quả. Tôi đã viết một triển khai Java (Java 6) và triển khai Scala (Scala 2.9). Tôi đã chạy cả trên Indigo Eclipse trong Ubuntu 10.04.
Các kết quả tương đương nhau: 480 ms cho Java và 493 ms cho Scala (trung bình hơn 100 lần lặp). Dưới đây là những đoạn tôi đã sử dụng.
// 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))
}
Vì vậy, trong trường hợp này, dường như chi phí Scala (sử dụng phạm vi, bản đồ, lambda) thực sự rất nhỏ, không xa với thông tin được cung cấp bởi Kỹ sư Thế giới.
Có lẽ có các cấu trúc Scala khác nên được sử dụng cẩn thận vì chúng đặc biệt nặng để thực thi?
CHỈNH SỬA 2
Một số bạn chỉ ra rằng các println trong các vòng bên trong chiếm phần lớn thời gian thực hiện. Tôi đã xóa chúng và đặt kích thước của danh sách thành 100000 thay vì 20000. Trung bình kết quả là 88 ms cho Java và 49 ms cho Scala.