代码之家  ›  专栏  ›  技术社区  ›  me_and

C中的性能/剖面测量

  •  1
  • me_and  · 技术社区  · 15 年前

    我在C中做了一些原型设计工作,我想比较一个程序完成各种小的修改需要多长时间。

    我一直在使用 clock 从K&P;

    时钟 返回自执行开始以来程序使用的处理器时间,或 -1 如果不可用。

    这对我来说似乎是明智的,而且已经产生了与我的期望大致相符的结果。但是,是否有更好的方法来查看哪些修改可以提高/降低代码的效率?

    更新:我对这里的Windows和Linux都感兴趣;在这两者上都能工作的东西是理想的。

    更新2:我对 分析 一个比简单程序从开始到结束的总运行时间/时钟周期要复杂的问题,我已经知道程序的哪些部分速度较慢。 时钟 似乎符合这个要求,但我不知道它有多脆弱,例如,在后台运行的其他进程占用了处理器时间。

    5 回复  |  直到 15 年前
        1
  •  1
  •   unwind    15 年前

    在POSIX中(例如在Linux上),可以使用 gettimeofday() 以获得更高精度的定时值(微秒)。

    在Win32中, QueryPerformanceCounter() 很受欢迎。

    注意CPU时钟变化的影响,如果您的CPU决定在测试期间打卡,结果可能会出现偏差。

        2
  •  4
  •   James    15 年前

    忘记time()函数,您需要的是:

    Valgrind!

    kcachegrind是检查callgrind配置统计信息的最佳GUI。过去我把应用程序移植到Linux上 只是 所以我可以使用这些工具进行分析。

        3
  •  2
  •   DevSolar    15 年前

    对于总体运行时间的粗略测量,有 time ./myprog .

    但为了 性能测量 ,您应该使用分析器。对于GCC,有 gprof .

    这两者都假定是一个UNIX环境。我肯定有类似的Windows工具,但我不熟悉它们。

    编辑: 澄清:我确实建议 反对 在代码中使用任何gettime()样式的函数。几十年来,为了完成您试图用五行代码来完成的工作,已经开发了profiler,它提供了一种更强大、更通用、更有价值和更简单的方法来找出代码的周期。

        4
  •  1
  •   Community T.Woody    7 年前

    我发现时间安排和优化是两个不同的问题,对于这两个问题,我个人更喜欢低技术。

    对于计时来说,关键是通过绕一圈来让时间足够长。例如,如果一个操作迭代1000次并用秒表计时,那么在删除循环时,秒变为毫秒。

    为了找到要优化的东西,有一些代码(终端指令和函数调用)负责时间的不同部分。在此期间,它们暴露在堆栈上。所以你可以在程序上绕一个圈,让它花费足够长的时间,然后 stackshots . 要优化的代码会跳到你身上。

        5
  •  0
  •   Alok Singhal    15 年前

    如果您可以使用POSIX函数,请看一下 clock_gettime . 我发现 an example 从谷歌快速搜索如何使用它。要测量程序所用的处理器时间,需要通过 CLOCK_PROCESS_CPUTIME_ID 作为第一个论点 时钟时间 ,如果您的系统支持它。自 时钟时间 使用 struct timespec ,您可能会获得有用的纳秒分辨率。

    正如其他人所说,对于任何严肃的分析工作,您都需要使用专用的探查器。