profile程序在Linux上的速度

时间:2008-09-29 17:50:17

标签: linux performance profiling

我有一些程序的变体,我想在性能上进行比较。两者都执行基本相同的任务。

一个人在C和记忆中做到这一切。另一个调用外部实用程序并执行文件IO。

如何可靠地比较它们?

1)使用“time”获取“CPU时间”有利于调用system()和执行IO的第二个变体。即使我将“系统”时间添加到“用户”时间,它仍然不会计入在等待()时被阻止的时间。

2)我不能只为它们在服务器上运行计时,并且可以随时将其推出CPU。对1000个实验进行平均是一个软选项,因为我不知道我的服务器是如何被利用的 - 它是集群上的VM,它有点复杂。

3)分析师没有帮助,因为他们会给我花时间在代码中,这再次有利于系统的版本()

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

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

(解决时间() - 见下文。谢谢大家)

5 个答案:

答案 0 :(得分:2)

如果我明白,在bash命令行上键入“time myapplication”并不是你想要的。

如果你想要准确,你必须使用一个探查器......你有源,是吗?

尝试使用OprofileValgrind之类的内容,或者查看this以获取更多扩展列表。

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

答案 1 :(得分:2)

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

$ /usr/bin/time -v xeyes
    Command being timed: "xeyes"
    User time (seconds): 0.00
    System time (seconds): 0.01
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.57
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 9
    Minor (reclaiming a frame) page faults: 517
    Voluntary context switches: 243
    Involuntary context switches: 0
    Swaps: 0
    File system inputs: 1072
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我似乎终于找到了它。

NAME        次 - 获取处理时间

概要        #include

   clock_t times(struct tms *buf);

说明        times()将当前进程时间存储在buf的struct tms中        指着。 struct 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实用程序。或者可能是我只是无知。

答案 4 :(得分:0)

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