我正在尝试为编程问题建立一个在线评判(如UVA OJ)。当判断程序时,需要测试它们的效率(即它们处理测试输入的速度)。但是,在服务器中,CPU通常非常强大,甚至可以非常快速地运行编码错误的程序。此外,某些程序在流量较低时可能会获得更多的CPU,而某些程序可能因流量较大而减少,这是不公平的。
所以我想知道,有没有办法测量程序效率,无论它运行在哪个CPU上?可能有一些CPU周期计算或类似的事情?
注意:
所以任何Linux或PHP解决方案都会很棒。
答案 0 :(得分:1)
环境:根据我的理解您的问题,您希望衡量一名考生编写的程序的性能,然后您希望能够将该性能与参考或反对进行比较其他考生计划。这些程序将在可能不同的Web服务器上运行。测试者将通过浏览器访问测试程序。测试者将分布在一些网络上(本地实验室?到校园?到全世界?)。测试输入来自文件。程序的预期运行时间<5秒,中位数为1秒。
指标:CPU时间对您没有帮助,因为根据硬件的不同,它会有所不同。例如,假设您正在比较Haswell一代Intel Xeon服务器上的相同CPU绑定程序的性能,而不是第一代Pentium上的性能。同一程序的执行同样有效,但奔腾上运行的程序由于运行的硬件而具有更大的CPU时间。即使你进入周期(参见PAPI),你也会遇到同样的问题。关键是您需要将程序的性能(运行时)与某些标准参考进行比较。
解决方案:这是一种可行的解决方案。这在理论上是可行的,但在给定网络技术和限制的情况下可能不实用。您创建一个标准参考程序(std_pgm),然后与测试者的程序(tt_pgm)同时运行它。关键是'同时'。您希望tt_pgm和std_pgm都在相同的环境(处理器,操作系统,负载等)中执行。然后,您可以比较不同环境中的相对性能。
其他问题 :( a)您需要确保程序使用相同的后台进程同时执行。只要内核负载相同,它们就不一定必须在同一个内核上运行。 (b)与程序的执行时间相比,尽量减少进程设置时间和文件I / O时间。 (c)多次运行程序,理想情况是在同一个过程中运行。这有两个目的:比较tt_pgm和std_pgm更容易,它为您提供了tt_pgm和std_pgm的执行环境是否相同的度量。 (如果tt_pgm与std_pgm相比的性能变化很大,则意味着背景中发生了一种情况,而不是另一种情况。)
我不保证这会起作用,但对我来说似乎是合理的。