我需要一些来自c ++代码的外部程序调用的帮助。
我必须多次从我的程序中调用javap.exe
(来自JDK包)(可能超过100),但调用system("javap.exe some_parameters")
非常慢。它对一组参数的工作非常好,但重复调用system()
是不可接受的。我认为这只是因为访问硬盘和应用程序运行的成本(但我不确定)。
我可以做些什么来提高性能?我可以“将javap.exe
保存在RAM中”并“直接”调用它。
或者可能有人知道如何在没有javap.exe
的情况下获得java类描述和方法签名?
答案 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()
调用的源代码以找到此示例。