0

我正在尝试设计一个在线编程竞赛评委,我需要确保的一件事是,当编译相同的代码时(假设要求),给定相同的输入,它应该花费完全相同的时间要执行的程序,每次完成。

目前,我正在使用一个简单的python脚本,它有2个线程,其中一个调用一个阻塞系统调用,开始执行测试代码,另一个跟踪时间并在时间后向子进程发送终止信号限制到期。顺便说一句,出于安全和方便的原因,我在虚拟机中执行此操作(设置适当的 chroot 太复杂,而且风险更大)。

但是,给定相同的条件(即,当我恢复快照时),我仍然会在任一侧大约 50 毫秒的范围内得到执行时间的变化。由于这阻止了设置严格的时间限制,是否有办法消除这种变化?

4

1 回答 1

2

我不是那个领域的专家,但我认为你做不到。即使您在虚拟机内部恢复快照,“外部”机器的状态也会大不相同。您有两个操作系统正在运行,每个操作系统都有多个进程,它们可能会在某个时候争夺资源。如果它是一个有互联网连接的网站或 PC,您可能会受到不同数量的连接(或请求)的影响,这将使进程开始运行并消耗请求等......如果某些应用程序试图访问硬盘,物理磁盘的初始位置对于寻道时间等很重要......

如果您想要一个“确定性”限制,您可能想检查您是否可以计算某个进程执行了多少条指令,或者类似的东西。

反正我参与过好几个编程内容,据我所知,他们不关心50毫秒的差异……如果你做一个合适的算法,你可以以很大的差距进入时间。因此,我建议您接受它,并将其包含在规则中。

于 2012-07-09T00:06:18.320 回答