【问题标题】:Is there a way to measure the efficiency of a program regardless of CPU?有没有办法在不考虑 CPU 的情况下测量程序的效率?
【发布时间】:2014-12-13 03:47:32
【问题描述】:

我正在尝试为编程问题建立一个在线法官(如UVA OJ)。在判断程序时,需要测试它们的效率(即它们处理测试输入的速度)。但是,在服务器中,CPU 通常非常强大,甚至可以非常快速地运行编码不佳的程序。而且,有些程序在流量低的时候可能会得到更多的CPU,而有些程序在流量大的时候可能会得到更少的CPU,这是不公平的。

所以我想知道,有没有一种方法可以衡量程序效率,而不管它在哪个 CPU 上运行?也许有一些 CPU 周期计算或类似的东西?

注意:

  1. 我在服务器端使用 PHP。
  2. 我可以在服务器中使用 Linux 命令。
  3. 我可以请求在服务器中安装 Linux 程序。
  4. 我想我可以将内存使用限制到一个进程(处理内存效率),但我不知道如何限制 CPU 使用。我问过here

所以任何 Linux 或 PHP 解决方案都会很棒。

【问题讨论】:

  • 您可能需要考虑 CPU 时间。它不同于程序启动和终止之间的时间。它衡量 CPU 实际运行程序所花费的时间,并且几乎不受其他进程的影响。
  • 如果您的程序寿命很短,您还可以使用性能计数器来计算已完成的指令数。使用 PAPI,即 PAPI_TOT_INS 计数器。
  • @user4098326 是的,我想过,但问题是,CPU 时间可能在低流量时非常快,而在高流量时可能有点慢。因此,当使用该网站的人减少时,即使是糟糕的程序也可能通过。
  • @Adam 你能给我一些关于如何使用它的链接吗?
  • 你在考虑挂钟时间。 CPU 时间是特定程序使用 CPU 所花费的时间。如果您的程序确实受 CPU 限制,那么这个时间应该保持不变。 Google 有很多 PAPI 示例,只有您知道哪些适合您的系统。 stackoverflow.com/questions/8160004/…

标签: performance cpu cpu-usage processing-efficiency


【解决方案1】:

环境:据我了解您的问题,您希望衡量由应试者编写的程序的性能,然后您希望能够将该性能与参考或对照进行比较其他应试者计划。这些程序将在可能不同的 Web 服务器上运行。应试者将通过浏览器访问测试程序。应试者将分布在某个网络上(实验室本地?校园?全世界?)。测试输入来自文件。程序的预期运行时间为

指标:CPU 时间对您没有帮助,因为它的含义因硬件而异。例如,假设您要在 Haswell 一代 Intel Xeon 服务器上与在第一代 Pentium 上比较相同 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 相比的性能差异很大,这意味着在后台发生了一些事情,而不是另一个。)

我不能保证这会奏效,但对我来说似乎是合理的。

【讨论】:

  • 太棒了!解决方案很棒。谢谢 :D 我需要试试这个。我正在考虑使用this
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多