2010-10-29 24 views
10

Người ta nói rằng Java nhanh hơn 10x so với python về hiệu suất. Đó là những gì tôi thấy từ điểm chuẩn. Nhưng những gì thực sự mang lại Java là thời gian khởi động JVM.Bất kỳ cách nào để tăng tốc độ khởi động JVM?

Đây là một thử nghiệm tôi đã thực hiện:

$time xlsx2csv.py Types\ of\ ESI\ v2.doc-emb-Package-9 
... 
<output skipped> 
real 0m0.085s 
user 0m0.072s 
sys  0m0.013s 


$time java -jar -client /usr/local/bin/tika-app-0.7.jar -m Types\ of\ ESI\ v2.doc-emb-Package-9 

real 0m2.055s 
user 0m2.433s 
sys  0m0.078s 

Cùng tập tin, 12 KB ms XLSX nhúng tập tin bên trong Docx và Python là 25x nhanh hơn !! WTH !!

Mất 2.055 giây cho Java.

Tôi biết đó là tất cả do thời gian khởi động, nhưng những gì tôi cần là tôi cần phải gọi nó thông qua một kịch bản để phân tích một số tài liệu mà tôi không muốn phát minh lại bánh xe trong python.

Nhưng khi phân tích 10k + file, nó chỉ là không thực tế ..

Dù sao để tăng tốc độ nó lên (Tôi đã cố gắng lựa chọn -Khách hàng và nó chỉ tăng tốc độ bởi rất ít (20%)).

Ý tưởng khác của tôi? Chạy nó như một daemon chạy dài, giao tiếp bằng cách sử dụng ổ cắm UDP hoặc Linux-ICP cục bộ?

+1

Không thể tin rằng không ai đã đề cập ** sử dụng phiên bản Java mới nhất ** – artbristol

+0

có thể trùng lặp của [Làm thế nào để tăng tốc thời gian khởi động Java VM (JVM)?] (Http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time) –

Trả lời

9

Hãy thử Nailgun.

Lưu ý: Tôi không sử dụng riêng tư.

+0

Âm thanh hoàn hảo !! thats những gì tôi cần !! Hãy để tôi thử nó và sẽ cho bạn biết. –

+4

Giải pháp hoàn hảo cho tôi.Tôi đã thử nghiệm và ngạc nhiên về mức độ đơn giản của nó, không bao giờ cần phải viết một dòng mã trong java, nó cung cấp trực tiếp quy trình chạy máy chủ Client-server! súng bắn đinh! –

+0

http://stackoverflow.com/questions/1491325/how-to-speed-up-java-vm-jvm-startup-time cũng đề cập đến nhỏ giọt vv ... – rogerdpack

2

Um ... ghi các tài liệu vào một thư mục (nếu chúng chưa sẵn sàng) và để chương trình Java xử lý tất cả chúng trong một lần?

+0

Vấn đề là, mọi lúc được phân tích cú pháp cần phải liên lạc lại (cho xử lý, đặt bên trong DB), vì vậy thats không phải là một điểm, cảm ơn tho, tôi đã xem xét tùy chọn này. –

0

Có rất nhiều cách để thực hiện việc này - về cơ bản mọi thứ sẽ hoạt động với việc giữ JVM hoạt động trong suốt thời gian xử lý hàng loạt của bạn.

ví dụ: tại sao không chỉ thay đổi chương trình Java để lặp qua tất cả các tệp và xử lý tất cả chúng trong một yêu cầu của JVM? Hoặc bạn có thể xây dựng một ứng dụng GUI đơn giản trong Swing và có một số cách trực quan để chạy hàng loạt (ví dụ: chọn các thư mục đích, sau đó nhấn nút "Xử lý tất cả ...").

Hoặc bạn có thể sử dụng một Clojure REPL như một cách để kịch bản thực hiện các công việc thích hợp Java ....

Hoặc bạn có thể tạo ra một quá trình máy chủ với một cái gì đó giống như Netty và gửi tất cả các tập tin của bạn thông qua đó .. ..

+0

Cảm ơn nhưng, những gì tôi đang làm là phía máy chủ, ứng dụng web, ajaxed. Có, tôi đã có quá trình tất cả các nút, trình duyệt thư mục, công cụ tìm kiếm tất cả mọi thứ đã được viết, trong Python (công cụ tìm kiếm là Sphinx trong C). –

5

Chỉ cần biết về nhỏ giọt ngày hôm nay, như một sự thay thế thay thế cho nailgun: https://github.com/flatland/drip cũng xem trang này để một số gợi ý chung: xem thêm https://github.com/jruby/jruby/wiki/Improving-startup-time

+0

Làm việc nhỏ giọt cho bạn với JRuby> = 1.7.2? Nỗ lực của tôi để đo lường bất kỳ sự tăng tốc đáng kể nào chưa thành công cho đến nay (thậm chí cả môi trường cào được thực hiện trên một dự án tầm thường được tạo ra thông qua đường ray mới không có lợi). –

+0

[Tôi chưa thử nó bao giờ.] Hệ điều hành nào? móng tay làm việc/giúp đỡ? (có thể hỏi những người nhỏ giọt?) – rogerdpack

+0

Dường như nó "có thể" làm việc với jruby, và nên có một phương pháp dripMain từ 1.7.1 Tôi tin rằng http://crashruby.com/2013/01/21/drip-with-jruby – rogerdpack

1

thay đổi chương trình của bạn đến một mô hình client/server, nơi Java một phần là một máy chủ liên tục chỉ được khởi động một lần, được cung cấp bởi ứng dụng khách cho biết cần phải làm gì. Các khách hàng có thể là một kịch bản Python nhỏ nói cho máy chủ xử lý các tập tin để tiêu thụ. Có thể gửi lệnh thông qua một ổ cắm, hoặc tín hiệu, tùy thuộc vào bạn.

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