C ++:重复调用system()

时间:2014-02-20 11:47:43

标签: c++ c++11

我需要一些来自c ++代码的外部程序调用的帮助。

我必须多次从我的程序中调用javap.exe(来自JDK包)(可能超过100),但调用system("javap.exe some_parameters")非常慢。它对一组参数的工作非常好,但重复调用system()是不可接受的。我认为这只是因为访问硬盘和应用程序运行的成本(但我不确定)。

我可以做些什么来提高性能?我可以“将javap.exe保存在RAM中”并“直接”调用它。 或者可能有人知道如何在没有javap.exe的情况下获得java类描述和方法签名?

2 个答案:

答案 0 :(得分:6)

Java VM开始运行并不便宜,而且它的初始化很可能占用了你的大部分时间。幸运的是,javap的功能可以直接通过Java代码获得。我建议你编写一个小型的Java应用程序,它与javap类似,只需要一次调用,否则你需要数千个。 (虽然......也许你已经可以只使用一个了?javap 采取多个类文件,毕竟......)

答案 1 :(得分:-1)

调用system()很简单,但效率很低,主要是因为您不只是启动您指定的任何程序。相反,您正在启动一个进程(shell),该shell将检查您的参数并启动第二个进程。

如果您使用的是支持fork()exec*()的系统,则可以通过使用它们来提高性能。作为伪代码示例,请考虑:

void replace_system(const char *command)
{
    pid_t child = fork();
    if (child < 0) {
        perror("fork:");
        return;
    }

    if (child) {
        /* this is the parent, wait for the child to finish */
        while (waitpid(child, &status, options) <= 0);
        return;
    }

    /* this is the new process */
    exec*(...);
    perror("failed to start the child");
    exit(-1);
}

根据您希望如何排列参数,选择一个exec *函数。您需要将参数字符串分解为组件,并可能提供您喜欢的环境。一旦调用exec *函数,该函数将永远不会返回(除非启动您为其定义的命令时出错)。

除了性能方面的考虑之外,使用它的另一个原因是,如果需要,它允许您修改子级的标准路径。例如,您可能对孩子的输出感兴趣;如果你将它的stdout修改为可用的管道,你可以简单地读取它打印的内容。研究标准popen()调用的源代码以找到此示例。