Performance 消除同一程序重复执行时的运行时变化

Performance 消除同一程序重复执行时的运行时变化,performance,virtual-machine,Performance,Virtual Machine,我正在尝试设计一个在线编程竞赛评委,我需要确保的一件事是,当编译相同的代码时(假设需要), 给定相同的输入,每次执行程序所需的时间应该完全相同 目前,我正在使用一个简单的python脚本 有2个线程,其中一个调用一个阻塞系统调用来启动测试代码的执行,另一个跟踪时间并向 时间限制过期后的子进程。顺便说一句,出于安全和方便的考虑,我在虚拟机中这样做(设置正确的chroot是必要的) 太复杂了,风险更大) 但是,在相同的条件下(即,当我恢复快照时),我仍然会得到执行所需时间的变化,每侧的变化范围约为5

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

目前,我正在使用一个简单的python脚本 有2个线程,其中一个调用一个阻塞系统调用来启动测试代码的执行,另一个跟踪时间并向 时间限制过期后的子进程。顺便说一句,出于安全和方便的考虑,我在虚拟机中这样做(设置正确的chroot是必要的) 太复杂了,风险更大)


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

我不是这方面的专家,但我认为你做不到。即使您在虚拟机内部恢复快照,“外部”机器的状态也会非常不同。您有两个正在运行的OSs,每个OSs包含多个进程,这些进程可能会在某个时候争夺资源。如果是一个网站或一台连接了internet的PC,您可能会被不同数量的连接(或请求)击中,这将使进程开始运行并使用请求等。。。如果某个应用程序试图访问硬盘,物理磁盘的初始位置对寻道时间非常重要,等等

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


不管怎么说,我参加过几个节目内容,据我所知,他们并不关心50毫秒的差异。。。如果你做了一个正确的算法,你可以在时间内获得一个非常大的余量。因此,我建议您接受它,并将其包括在规则中。

为什么希望或期望您能够让代码执行所需的时间完全相同,达到毫秒?在现代多线程操作系统上,尤其是在虚拟机中,运行时必须至少以毫秒为单位。还有许多其他事情会影响调度等。垃圾收集是另一个变量。I/O增加了更多的随机性。除非您使用RTOS(甚至…),否则不可避免地会出现一些差异。我会运行测试代码50次(例如),或者更多次,并且平均运行。也许可以检查差异,以确保在运行过程中没有出现任何奇怪的情况。我在这方面的经验来自基于lisp、java和py的系统。