ก่อนอื่นฉันต้องการทำให้ชัดเจนว่านี่ไม่ใช่คำถามภาษา -X- กับภาษา -Y เพื่อตรวจสอบที่ดีกว่า
ฉันใช้ Java มานานแล้วและตั้งใจจะใช้มันต่อไป ขนานไปกับสิ่งนี้ฉันกำลังเรียน Scala ด้วยความสนใจอย่างยิ่งนอกเหนือจากสิ่งเล็ก ๆ น้อย ๆ ที่ทำให้ฉันคุ้นเคยกับความประทับใจของฉันก็คือฉันสามารถทำงานได้ดีมากในภาษานี้
คำถามของฉันคือซอฟต์แวร์ที่เขียนใน Scala เปรียบเทียบกับซอฟต์แวร์ที่เขียนใน Java ในแง่ของความเร็วในการดำเนินการและการใช้หน่วยความจำได้อย่างไร แน่นอนว่านี่เป็นคำถามที่ตอบยากโดยทั่วไป แต่ฉันคาดหวังว่าการสร้างระดับที่สูงขึ้นเช่นการจับคู่รูปแบบฟังก์ชันการเรียงลำดับที่สูงขึ้น ฯลฯ แนะนำค่าใช้จ่ายบางอย่าง
อย่างไรก็ตามประสบการณ์ปัจจุบันของฉันใน Scala จำกัด เพียงตัวอย่างเล็ก ๆ ภายใต้รหัส 50 บรรทัดและฉันยังไม่ได้ใช้การวัดประสิทธิภาพใด ๆ จนถึงตอนนี้ ดังนั้นฉันไม่มีข้อมูลจริง
ถ้าปรากฎว่า Scala มีค่าใช้จ่ายในการเขียน Java ค่อนข้างสมเหตุสมผลหรือไม่ที่จะรวมโครงการ Scala / Java เข้าด้วยกันโดยที่หนึ่งรหัสในส่วนที่ซับซ้อนมากขึ้นใน Scala และส่วนที่มีความสำคัญต่อประสิทธิภาพใน Java นี่เป็นเรื่องธรรมดาไหม
แก้ไข 1
ฉันใช้เกณฑ์มาตรฐานขนาดเล็ก: สร้างรายการจำนวนเต็มคูณแต่ละจำนวนเต็มด้วยสองและใส่ไว้ในรายการใหม่พิมพ์รายการผลลัพธ์ ฉันเขียนการติดตั้ง Java (Java 6) และการปรับใช้ Scala (Scala 2.9) ฉันรันทั้ง Eclipse Indigo ภายใต้ Ubuntu 10.04
ผลการเปรียบเทียบ: 480 ms สำหรับ Java และ 493 ms สำหรับ Scala (เฉลี่ยมากกว่า 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))
}
ดังนั้นในกรณีนี้ดูเหมือนว่าค่าใช้จ่ายสกาล่า (โดยใช้ช่วง, แผนที่, แลมบ์ดา) นั้นน้อยมากจริง ๆ ซึ่งไม่ไกลจากข้อมูลที่วิศวกรโลกมอบให้
อาจมีโครงสร้างแบบสกาล่าอื่น ๆ ที่ควรใช้ด้วยความระมัดระวังเพราะมีความหนักเป็นพิเศษในการดำเนินการหรือไม่
แก้ไข 2
บางท่านชี้ให้เห็นว่า println ในลูปด้านในใช้เวลาส่วนใหญ่ในการประมวลผล ฉันได้ลบออกแล้วตั้งขนาดของรายการเป็น 100000 แทนที่จะเป็น 20,000 ผลลัพธ์เฉลี่ยคือ 88 ms สำหรับ Java และ 49 ms สำหรับ Scala