Mam skrypt w Pythonie, który wykonuje niektóre obliczenia. Uruchomienie tego skryptu w konsoli trwa około 7 minut, ale po uruchomieniu jest napisane, że powłoka Java trwa trzy razy dłużej. Używam następujący kod do wykonania skryptu Java:Dłuższe wykonanie przez powłokę Java niż konsola?
this.p = Runtime.getRuntime().exec("script.py --batch", envp);
this.input = new BufferedReader(new InputStreamReader(p.getInputStream()));
this.output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
this.error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
Czy macie jakieś sugestie dlaczego skrypt Pythona przebiega trzy razy dłużej niż w Javie w konsoli?
Aktualizacja (29.12.2010)
Obliczenia idzie się następująco:
- Java wysyła dane do Pythona.
- Python odczytuje dane.
- Python generuje drzewo decyzyjne - jest to długa operacja.
- Python wysyła potwierdzenie, że drzewo jest gotowe.
- Java otrzymuje potwierdzenie.
Później jest seria komunikacji między Javą i Pythonem, ale zajmuje to tylko kilka sekund.
Aktualizacja (29.12.2010)
Dziękuję za wszystkie komentarze i sugestie. Zajęło mi jeden dzień roboczy, aby się przekonać, że moje założenie było błędne. Kod, którego użyłem miał "błąd", a w rzeczywistości różne obliczenia były wykonywane w konsoli iw powłoce. Kiedy to naprawiłem, czas obliczeń był taki sam.
Podsumowanie: Czas obliczeń skryptu uruchamianego w konsoli iw powłoce Java jest prawie taki sam. Dodatkowy czas na zainicjowanie komunikacji Java VM i IO jest nieistotny.
Czy jest dużo IO? Czy jest to proces związany z procesorem? – marcog
Jest to proces związany z procesorem. Skrypt odbiera dane tylko na początku, ale robi się to szybko. Następnie skrypt tworzy drzewo decyzyjne, co jest bardzo czasochłonne. – czuk
Co robisz z 'input' i' error'? Odrzucasz go lub przechowujesz w pamięci? I ile danych wyjściowych zaprogramujesz na te strumienie? – rodion