Я полагаю, вы исключили возможность того, что обертка Java запускается одновременно, как что-то еще, что вызывает огромный конфликт из-за нехватки ресурсов? Хорошо.
Если у вас есть простой класс, подобный этому:
public class Exec {
public static void main(String[] args) throws Throwable{
class Transfer implements Runnable {
private final InputStream in;
private final OutputStream out;
public Transfer(InputStream i, OutputStream o){
in = i;
out = o;
}
public void run(){
try {
for (int i; (i = in.read()) != -1;) out.write(i);
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Process proc = new ProcessBuilder(args).start();
new Thread(new Transfer(System.in, proc.getOutputStream())).start();
new Thread(new Transfer(proc.getInputStream(), System.out)).start();
new Thread(new Transfer(proc.getErrorStream(), System.err)).start();
System.exit(proc.waitFor());
}
}
... а вы сравниваете time perl script.pl insert args here
и time java Exec perl script.pl insert args here
, что происходит? Если мир нормален, им требуется примерно одинаковое время (за исключением того, что второй требуется несколько секунд для запуска Java), и если это так, постепенно начинайте адаптировать класс Exec
, чтобы он выглядел все больше и больше похожим на ваш среду развертывания, и посмотрите, когда она действительно займет много времени.
Если Exec
выше действительно занимает больше времени, начните регистрироваться как сумасшедшие в скрипте Perl, чтобы увидеть, какие действия занимают больше времени. И, между прочим, войдите в Java-оболочку, чтобы увидеть, занимает ли запуск Perl действительно много времени или что-то в этом роде.