Java中的自动编译,自动运行,自动比较结果

时间:2011-03-14 16:43:45

标签: java programming-languages runtime memory-management performance

亲爱的,所有人, 我是Java新手,现在我正在尝试在Java下开发一个应用程序来做这些事情: 假设: 有一个文件包含Java中的源代码。 让我们假设该文件包含一个主类(它的主要方法有几个额外的方法)和一些将在主类运行时使用的内部类。

过程:

  1. 我想开发的应用程序(称为ASIN),将尝试编译我们上面假设的源代码。
  2. 编译阶段完成后。我希望ASIN会分配一些32 Mb的内存空间(例如),并且最长运行时间为2秒(例如)。
  3. 在分配内存和运行的最大时间限制之后,ASIN将尝试使用给定的最大时间使用分配的资源(内存32 Mb)来运行java字节代码。然后ASIN将记录/捕获结果。如果正在运行的字节代码使用的内存超过分配的内存,或超过给定的时间限制,ASIN将强制停止执行。所以,正常情况是执行在最大时间限制之前完成并且使用少于分配的内存。
  4. java可以做上面的事吗? 任何建议我该怎么办?

    的问候,

2 个答案:

答案 0 :(得分:1)

这应该是编程竞赛或大学课程练习的评分系统吗?可能存在开源系统,所以如果你还没有谷歌它首先。如果您必须/想要自己创建一个,我不确定Java是否允许您限制程序所花费的时间(当然,您可以在等待一定时间之后简单地终止该程序),但是可以使用例如指定java程序的内存限制使用-Xmx32m命令启动程序时java。如果这是在unix系统上,最简单的解决方案可能是使用ulimit来限制内存使用和运行时间。

在任何一种情况下,我认为你必须使用Runtime.exec()来启动编译器和程序。这也可以让您将输入提供给流程并读取流程的输出(尽管如果您使用例如启动程序,也可以对文件执行I / O重定向。

Runtime.getRuntime().exec("java -Xmx32m Program.class < input.txt > output.txt");

至于比较:除非您需要完全匹配(即使在空格中),最简单的解决方案可能是将输出重定向到文件并使用diff或{{1}调用-b }},可能-w;如果返回码为0,则输出等于解决方案(空白差异除外)。另一方面,如果您需要交互式评分(该程序应该与评分者“交谈”),或者如果输出可能以不同的方式形成,使得没有唯一正确的答案,则不能使用{{1 }};评分者必须改为读取进程的输出流。

答案 1 :(得分:0)

我在shell脚本而不是java中执行此操作。这会是一种选择吗?

您可以使用ulimit进行内存和时间限制。如果你编写一个小shell脚本来执行此操作:

set -e
ulimit -v 32768 # ulimit -v works in 1 kB blocks, so this is 32 MB
ulimit -t 2 # ulimit -t works in seconds
java ProgramUnderTest >output

然后当你运行它时,它会给自己提供内存和时间限制,并将java作为子进程启动。如果程序及时完成(注意限制是CPU时间,而不是实时),它将以退出状态0结束;否则,它会有一些非零退出状态。

如果您想记录限制内使用的实际时间,请在time下运行java:

time java ProgramUnderTest >output

这将打印输出后使用的总时间。

编译脚本中的代码当然也很简单 - 只需运行javac即可。请记住检查退出状态以查看代码是否已正确编译。