2014-09-12 33 views
9

Tôi đã sử dụng Rhino cho một thành phần kịch bản bên trong đồ họa. Trong dự án có khoảng 200 kịch bản nhỏ chạy độc lập. Ngay lập tức khi bắt đầu ứng dụng, các tập lệnh phải ở tốc độ tối đa. Hiệu suất của Rhino là đủ, nhưng kể từ khi Oracle đề nghị chuyển sang Nashorn, tôi đang đối mặt với một sự pha loãng.Có thể khắc phục chậm trễ khởi động Nashorn?

Bên dưới ảnh hiển thị chênh lệch tải giữa Rhino và Nashorn với xấp xỉ 15.000 lần gọi các tập lệnh. Startup slow của Nashorn là vấn đề lớn nhất của tôi.

Lưu ý, điều này đã trở lại trên JDK 1.8.0. JDK 1.8u5 cũng tương tự như

Engine performance compared

Tôi hy vọng hình ảnh rõ ràng.

Đây là một phác thảo của làm thế nào tôi sử dụng ScriptEngine:

  • Tôi đang sử dụng Một ví dụ động cơ kịch bản,
  • tôi tạo ra một đối tượng CompiledScript cho mỗi kịch bản,
  • một SwingWorker thực hiện một CompiledScript .eval() một lần.
  • Nửa giây một lần các SwingWorkers được bắt đầu.
  • Mỗi trình biên dịch có một cá thể SimpleScriptContext riêng của nó được sử dụng lại cho mỗi lần thực thi.

Dưới đây tôi đã bao gồm hồ sơ thời gian chạy của động cơ bận như thế nào theo thời gian; enter image description here

Có ai biết cách khắc phục sự chậm trễ khởi động của Nashorn không?


CẬP NHẬT 15 Tháng 4 '15
Ran cùng một thử nghiệm với 200 kịch bản riêng biệt trên Java8u45.
Hiệu suất tốt hơn nhiều! Chạy nhanh như Rhino trên Java7.

+0

Tê giác dưới Java 1.8 có thể được tiết lộ. –

+0

Cảm ơn, đó sẽ là hy vọng cuối cùng của tôi. Nhân tiện, tôi đọc [ở đây] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8) mà tôi cần một cái lọ được chế tạo thủ công. Bất kỳ ý tưởng tại sao, hoặc nó sẽ chỉ được cho chán nản? – Houtman

+0

Tôi đọc: "Nếu bạn muốn nhận được nhị phân dựng sẵn thay vào đó, bạn có thể tải xuống từ đây:" - do đó, không có vấn đề gì. Nó được biên dịch trong không phải Java 1.8 - vì vậy những gì. –

Trả lời

1

On Java 1.8, bạn có thể sử dụng Rhino qua javax.script API bằng cách sử dụng phụ thuộc Maven này và yêu cầu các cơ rhino:

<dependency> 
     <groupId>de.christophkraemer</groupId> 
     <artifactId>rhino-script-engine</artifactId> 
     <version>1.1.1</version> 
    </dependency> 

Trang chủ ở đây: https://github.com/cevou/rhino-script-engine

Binaries: here

Nếu bạn muốn phiên bản mới nhất của Rhino, bạn có thể ghi đè lên bằng cách thêm một cái gì đó như thế này:

<dependency> 
     <groupId>org.mozilla</groupId> 
     <artifactId>rhino</artifactId> 
     <version>${rhinoVersion}</version> 
    </dependency> 

Binaries: here

Ngẫu nhiên, nếu bạn muốn sử dụng được sự mới nhất Rhino trên Java 1.7 qua javax.script, bạn nên yêu cầu tên công cụ rhino17R5 hoặc bạn có thể ngẫu nhiên nhận được một thể hiện của Tê giác cũ mà là một phần của JRE. Tên công cụ chính xác bắt buộc phụ thuộc vào phiên bản rhino-script-engine. Đối với 1.1.1, nó là rhino17R5.

+0

Cảm ơn. (Tôi không quen với maven) Tôi không chắc chắn, nhưng nếu tê giác của bạn là phiên bản tương tự như có thể được xây dựng bằng cách sử dụng bài viết này: https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino + JSR-223 + engine + với + JDK8 Sau đó, trình thông dịch đó thực sự hơi chậm hơn một chút so với phiên bản được xây dựng sẵn trong java7. Có lẽ bạn biết tại sao? – Houtman

+0

Tôi nghĩ rằng cái này được lấy trực tiếp từ OpenJDK (có lẽ là 7), bởi vì nó là ngoại lệ GPL + Classpath. Tôi nghĩ rằng nó sẽ là một thực hiện mới hơn nhiều so với một trong những bạn đề cập đến. – seanf

+0

Mức tối ưu hóa mặc định của Rhino có thể đã thay đổi giữa triển khai 'ScriptEngine' cũ cho Rhino và phiên bản mới hơn. – seanf

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