如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?

How to get execution time and memory usage of a program (c,c++,java,python,php) in php script on ubuntu?

本文关键字:php python java c++ 执行时间 内存 使用量 上的 ubuntu 脚本 程序      更新时间:2023-10-16

我正在尝试使用带有laravel的php构建一个在线判断网站,该网站可以判断用户提交的代码。服务器环境是 ubuntu。

每个问题都有一个输入文件和相应的输出文件,以及代码的最大执行时间限制和内存使用限制。

假设,对于一个问题,输入文件 input.in,输出文件是正确的。法官将运行用户的代码并生成输出文件,并将其与 correct.out 进行比较,以检查解决方案是否正确。它还将检查代码是否在给定的时间限制和内存限制内运行。

允许用户使用c,c ++,java,python或php提交他们的解决方案

我做了什么:

对于 c++ 代码,假设用户的代码是 code.cpp。我在我的 php 脚本中使用了 exec((,如下所示:

exec('g++ -o code code.cpp');

这将创建一个名为"code"的可执行文件。

现在,我已经使用 input.in 文件运行可执行文件,并使用以下命令生成了 output.out 文件:

exec('./code < input.in > output.out');

这将给出输出文件。

现在我需要知道程序执行花费了多少时间,以及它用于在代码中运行或声明变量、数组或其他数据结构的内存量。

我可以通过计算执行的开始时间和结束时间之间的差异来找到执行时间。

我的问题是:

  • 有没有更好的方法来找到执行时间?

  • 如何找到程序使用了多少内存?

  • 如何检查编译错误,运行时错误?

你回答:

  1. 我认为没有比这更好的方法可以直接测量exec运行多长时间。

  2. 探查器是唯一的方法(valgrind(。但是,探查器会影响性能(它会以破坏性方式降低性能(。当进程仍在运行时,您可以通过以下命令检查其内存使用情况:

    grep VmPeak /proc/$PID/status

精度会非常差,对于类似于echo的快速过程,您甚至可以没有时间运行此 shell 命令。

    检查
  1. 退出代码(从g++./code(检查错误。对于g++,关于自定义程序,它可以有自定义逻辑并使用自己的协议来报告错误,但通常如果./code遵循惯例,则必须在错误时将退出代码设置为非零。

但是,一般来说,不能保证理解程序是否正确运行,因为"正确"是关于语义而不是纯编码。"正确"是软件作者希望它工作的方式。如果软件作者认为软件必须使用特定代码退出,他可以独立于任何内部错误来执行此操作。

例如,请参阅以下代码:

#include <iostream>
#include <cstdlib>
int main()
{
int z = 1;
int y = 1;
int x = 1 / (z - y);
return 0;
}

它生成"除以零"异常。

让我们编译并执行它:

$ g++ program_1.cpp -o program_1
$ ./program_1
Floating point exception (core dumped)
$ echo $?
136

程序以代码136退出;原因是 C 运行时实现的默认除以零信号处理程序与此代码一起退出。

如果我们添加自己的信号处理程序,退出代码仍将0

#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <signal.h>
void signal_handler (int signo) 
{
if(signo == SIGFPE) 
exit(0);
}
int main()
{
signal(SIGFPE,(*signal_handler));
int z = 1;
int y = 1;
int x = 1 / (z - y);
return 0;
}

因此,当您运行完全未知的外部代码时,几乎不可能理解它真正的作用;例如,病毒的工作方式与预期不同。