用Java加速外部调用

时间:2015-01-03 12:20:23

标签: java performance temporary-files external-process

我在JAVA中有一个程序需要每次启动时调用两次其他外部可执行文件(用C ++编写)数千次。每个计算的实际计算时间实际上是毫秒,因此整个程序的瓶颈是调用和写入/读取临时文件(external_exe_2只能从文件读取其输入)。另外,我需要检查是否没有发生错误。

我有一个以下基准测试程序来衡量外部呼叫的性能:

long launchtime = (new Date()).getTime();

int n=1000;
String[][] sargs = new String[][]
    {{"external_exe_1", "arg1", "-o", "file.tmp"},
    {"external_exe_2", "arg2", "-i", "file.tmp"}};
String line, message;
Process process;
InputStream stderr;
BufferedReader reader;
StringBuilder bstring;
for (int i=0; i<n; i++)
    for (int j=0; j<2; j++) {
        process = Runtime.getRuntime().exec(sargs[j]);
        stderr = process.getErrorStream();
        reader = new BufferedReader (new InputStreamReader(stderr));
        bstring = new StringBuilder();
        while ((line=reader.readLine()) != null)
            bstring.append(line);
        message=bstring.toString();
        if (!message.isEmpty()) {
            System.err.println("Error: "+message);
            reader.close();
            return;
        }
    }

long exec_time = (new Date()).getTime() - launchtime;
System.out.printf("%d repeats done in %.3f sec\n", n, exec_time*0.001);

然而,速度根本不令人满意。实际上,它甚至比Python模拟速度慢。有什么东西我可以提高它吗?

1 个答案:

答案 0 :(得分:0)

如果在Linux / Mac上运行,最好还是产生一个shell进程(即/ bin / bash -i),并将每个命令调用提供给shell来执行。这避免了为每次迭代重新创建流。为此,您需要为每次执行执行一些输出结束标记(即通过发送

"external_exe_1 arg1 -o file.tmp ; echo 'EOI EOI'"

到shell)。