2010-12-28 6 views
6

Tengo un script en Python que hace algunos cálculos. Cuando ejecuto este script en la consola, demora unos 7 minutos en completarse, pero cuando lo ejecuto, creo que el shell de Java tarda tres veces más. Yo uso siguiente código para ejecutar el script en Java:¿Mayor ejecución a través del shell de Java que la consola?

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())); 

¿Tiene usted alguna sugerencia de por qué la secuencia de comandos de Python se ejecuta tres veces más tiempo en Java que en una consola?

actualización (29.12.2010)

El cálculo va de la siguiente manera:

  1. Java envía datos al pitón.
  2. Python lee los datos.
  3. Python genera un árbol de decisión --- esta es una operación larga.
  4. Python envía una confirmación de que el árbol está listo.
  5. Java recibe la confirmación.

Luego hay una serie de comunicaciones entre Java y Python, pero solo lleva varios segundos.

actualización (29.12.2010)

Gracias por todos sus comentarios y sugerencias. Me llevó un día de trabajo descubrir que mi suposición era incorrecta. El código que utilicé tenía "un error" y, de hecho, se realizaron cálculos diferentes en consola y en shell. Cuando lo arreglé, el tiempo de cálculo fue el mismo.

Resumen: El tiempo de cálculo de un script ejecutado en la consola y en el shell de Java es casi el mismo. El tiempo adicional para inicializar Java VM y la comunicación IO es insignificante.

+2

¿Hay mucho IO? ¿O es un proceso vinculado a la CPU? – marcog

+0

Es un proceso vinculado a la CPU. El script recibe datos solo al principio, pero esto se hace rápidamente. Después de eso, el script crea un árbol de decisiones que consume mucho tiempo. – czuk

+0

¿Qué estás haciendo con 'input' y' error'? ¿Desecharlo o guardarlo en la memoria? ¿Y cuánto rendimiento genera el programa para estas transmisiones? – rodion

Respuesta

2

Intente utilizar el mismo código sin los BufferedReaders y BufferedWriters, en caso de que haya un retraso introducido por el almacenamiento en búfer. No estoy seguro de cuánto tiempo los escritores almacenados en memoria intermedia esperan para sonrojar, pero al menos, eliminarlos ayudaría a simplificar su problema.

Cuestiones relacionadas