2009-08-22 26 views
20

Tôi khá ngu dốt về thế giới Java (tôi chủ yếu là C/Python) nhưng Scala trông đủ thú vị để kéo tôi vào. Một vấn đề tôi gặp phải là chi phí khởi động khổng lồ - tối thiểu 0,3 giây, nhiều hơn nếu Tôi đang sử dụng trình thông dịch thay vì biên dịch, so với hiệu quả 0 đối với Python hoặc C. Vì vậy, mặc dù ngôn ngữ nhanh hơn Python gấp hàng chục lần, nếu tôi đang cố gắng sử dụng nó cho các tác vụ đơn giản, nó vẫn đáng kể chậm hơn trong thực tế.Làm thế nào để giảm chi phí khởi động Scala (/ Java)?

Có cách nào để giảm thời gian này hay là một phần không thể tránh khỏi của JVM + số lượng nhập khẩu bắt buộc (tiềm ẩn) cho một chương trình Scala?

+0

Xem thêm http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time –

Trả lời

15

Bạn đang sử dụng loại máy tính nào? Rõ ràng là có một chi phí khởi động JVM nhưng điều này thậm chí còn lớn hơn nếu JVM phát hiện bạn đang chạy trên server-class machine.

Trong phiên bản nền tảng J2SE 5.0 một lớp học của máy được gọi là một máy server-lớp đã được định nghĩa như là một máy với:

  • 2 hoặc nhiều bộ xử lý vật lý
  • 2 hoặc nhiều Gbytes bộ nhớ vật lý

Bạn có thể đặt JVM trong chế độkhách hàng bằng cách sử dụng các -client tùy chọn. Chế độ khách hàng được điều chỉnh cho thời gian khởi động nhanh.

Ngoài ra còn có những động thái để modularize the JVM (dự án Jigsaw) mà sẽ cải thiện thời gian khởi động thậm chí nhiều hơn - điều này đã bắt đầu với JDK 1.6.0_10.

+1

Cảm ơn.-client giúp đáng kể, đưa chương trình thử nghiệm 'echo' của tôi từ 0,3 giây đến 0,12 giây trung bình. Đó là đủ thấp để cảm thấy đáp ứng trong hầu hết các trường hợp. Hầu hết các 'khách hàng' tồi tệ nhất hiện đủ dày để đáp ứng các yêu cầu của máy chủ. –

8

Bạn có thể làm việc xung quanh thời gian khởi động JVM bằng cách mở Scala REPL và sau đó tải tập lệnh của bạn trực tiếp vào nó bằng lệnh :load. Điều này biên dịch (nó mất một thời gian, nhưng tôi không tìm thấy nó dài trong thực tế) nội dung của kịch bản và tải nó để sử dụng trong REPL. Ví dụ:


scala> :load testScript.scala 
Loading testScript.scala... 
import scala.collection.mutable.Map 
memory: scala.collection.mutable.Map[Int,Int] = Map() 
fib: (Int)Int 
res7: Int = 165580141 

scala> fib(10) 
res1: Int = 55 

scala> fib(11) 
res2: Int = 89 

scala> fib(12) 
res3: Int = 144 

scala> fib(13) 
res4: Int = 233 

Ví dụ, một công việc điển hình của tôi khi viết nguyên mẫu khác nhau trong Scala là như sau. Tôi có một trình soạn thảo văn bản mở trong một cửa sổ, và Scala REPL trong một cửa sổ khác. Tôi viết mã của tôi và sau đó tải nó (:load script.scala). Các kết quả do kịch bản tạo ra có sẵn ngay lập tức (như đã thấy trong bảng điểm trên, res7) và bất kỳ hàm, lớp hoặc đối tượng nào được xác định trong tập lệnh cũng có sẵn. Và nó nhanh hơn chạy scala myScript.scala khi JVM đã được tải.

Nếu bạn đi tuyến đường đã biên dịch, hãy sử dụng fsc (trình biên dịch Scala nhanh). Lần đầu tiên nó được gọi nó tạo ra một quá trình daemon biên dịch mã. Vì vậy, bạn sẽ chỉ phải trả giá khởi điểm JVM một lần. Chỉ cần lưu ý rằng nếu bạn thay đổi giá trị của CLASSPATH (biến môi trường), bạn sẽ phải khởi động lại fsc (đó là một cái gì đó đã lỗi tôi một thời gian).

-- Flaviu Cipcigan

+0

Ngay cả với fsc không có cách nào để mang lại biên dịch xuống một thời gian khởi động lành mạnh (tức là công cụ thân thiện). Mục đích là để giảm thời gian khởi động khi tôi đã biên dịch nó, mà vẫn còn dài một cách đáng kể. –

+0

Vâng, vì tôi đang học, tôi thích mẹo REPL: load –

Các vấn đề liên quan