1

我有几个我想比较性能的程序变体。两者都执行基本相同的任务。

一个人在 C 和内存中完成所有工作。另一个调用外部实用程序并执行文件 IO。

我如何可靠地比较它们?

1) 使用“时间”获取“CPU 时间”有利于调用 system() 和执行 IO 的第二种变体。即使我将“系统”时间添加到“用户”时间,它仍然不会计算在 wait() 上阻塞的时间。

2) 我不能只为它们计时,因为它们在服务器上运行,并且可以随时从 CPU 上推出。平均 1000 次实验是一个软选项,因为我不知道我的服务器是如何使用的——它是集群上的虚拟机,有点复杂。

3)分析器没有帮助,因为它们会给我时间花在代码上,这再次有利于执行 system() 的版本

我需要将这些程序消耗的所有 CPU 时间累加起来,包括用户、内核、IO 和孩子的递归时间。

我预计这是一个常见问题,但似乎仍然没有找到解决方案。

(用 times() 解决 - 见下文。谢谢大家)

4

5 回答 5

2

如果我理解的话,在 bash 命令行上键入“time myapplication”并不是您想要的。

如果你想要准确性,你必须使用分析器......你有来源,是吗?

试试OprofileValgrind之类的东西,或者看看这个以获得更多扩展列表。

如果你没有来源,老实说我不知道​​......

于 2008-09-29T17:57:46.683 回答
2

/usr/bin/time(不是 bash 中内置的“时间”)可以提供一些有趣的统计信息。

$ /usr/bin/time -v xeyes
    正在计时的命令:“xeyes”
    用户时间(秒):0.00
    系统时间(秒):0.01
    此作业获得的 CPU 百分比:0%
    经过(挂钟)时间(h:mm:ss 或 m:ss):0:04.57
    平均共享文本大小(千字节):0
    平均非共享数据大小(千字节):0
    平均堆栈大小(千字节):0
    平均总大小(千字节):0
    最大驻留集大小(kbytes):0
    平均驻留集大小(kbytes):0
    主要(需要 I/O)页面错误:9
    次要(回收帧)页面错误:517
    自愿上下文切换:243
    非自愿上下文切换:0
    掉期:0
    文件系统输入:1072
    文件系统输出:0
    发送的套接字消息:0
    收到的套接字消息:0
    传递的信号:0
    页面大小(字节):4096
    退出状态:0
于 2008-09-29T19:22:29.333 回答
1

运行一千次,测量实际花费的时间,然后平均结果。这应该可以消除由于服务器上运行的其他应用程序造成的任何差异。

于 2008-09-29T17:58:59.330 回答
1

我好像终于找到了。

NAME 时间 - 获取处理时间

概要#包括

   clock_t times(struct tms *buf);

描述 times() 将当前进程时间存储在 buf 指向的 struct tms 中。结构 tms 定义如下:

   struct tms {
          clock_t tms_utime;  /* user time */
          clock_t tms_stime;  /* system time */
          clock_t tms_cutime; /* user time of children */
          clock_t tms_cstime; /* system time of children */
   };

孩子们的时间是所有等待孩子的递归总和。

我想知道为什么它还没有成为标准的 CLI 实用程序。或者我可能只是无知。

于 2008-10-01T09:43:29.257 回答
0

我可能倾向于将“time -o somefile”添加到系统命令的前面,然后将其添加到 time'ing 主程序给出的时间中以获得总数。除非我必须多次这样做,否则我会找到一种方法来获取两次输出并将它们添加到屏幕上(使用 awk 或 shell 或 perl 或其他东西)。

于 2008-09-29T18:05:46.803 回答