【问题标题】:Performance of the c codec代码的性能
【发布时间】:2010-12-14 13:02:56
【问题描述】:

我在我的 c 程序中使用 gcc。如何检查哪种方法更快(假设我编写了一个代码来交换两个数字并使用位运算符重写了相同的代码),linux中有没有工具可以检查时间、性能和空间?

【问题讨论】:

  • 我不知道你说的空间是什么意思?你指的是内存分配吗?
  • 是的,彼得空间(内存)

标签: c linux performance gcc profiling


【解决方案1】:

man gprof 应该会有所帮助。

但请记住,如果您使用分析器,您应该测试大量循环。 并且您应该在计算缓存效果的情况下执行此操作,因此至少应该在足够大的内存区域数据上以随机(但相同)的顺序执行此操作。为此使用 srandom() / random()。

最小设置:

  • 编写“测试台”,通过相同的输入循环不同的方法(足够大的循环)。
  • 使用 GNU 编译器 -pg 选项编译/链接您的模块。
  • 运行。您应该获取配置文件数据文件(通常是 gmon.out)。
  • man gprof -> gprof [options] -> 生成您需要的报告 -> 查看您真正需要的内容。

【讨论】:

  • 感谢 roman,但我如何使用这个工具,我是 gprof 的新手,谢谢
  • 我体验过编译到可执行文件中的分析代码会影响测量,所以我肯定会在没有分析的情况下运行,只测量时间。
  • Thomas,这是测试台质量的问题。对于简单的测量,您甚至可以运行大量循环并使用“时间”命令;)。但这永远不会让你知道你如何度过你的时间。
  • 如果您只想测试一项操作,那么这就是您花费时间的方式。问题是比较两个不需要完整上下文的操作。这是我对这个问题的解释。
【解决方案2】:

在你描述的简单情况下,我会使用这个

$ vi test.c
$ make test
cc     test.c   -o test
$ time ./test

real    0m1.001s
user    0m0.001s
sys     0m0.000s

当比较几个组件的完整执行时,我会使用 Roman 概述的 gprof 方法。

这一切都取决于情况。但是十分之九的时间方法对我来说就足够了。但我想当使用线程多进程和 GUI 代码时,情况会有所不同。然而,这不是我的专业领域。

有一个工具叫Valgrind (wikipedia),我建议你也看看。

有一些 Valgrind 工具可以自动检测许多内存管理和线程错误,并详细分析您的程序。

【讨论】:

  • +1 表示 Valgrind 点。我只是需要这样的东西,但目的不同。使用“时间”的方法可能会导致高测量误差。它至少包括启动和停止子进程的时间,这对加载的系统有很大的变化。所以它的应用非常有限。并且需要更多数量的独立测试循环。
【解决方案3】:

要查找代码所花费的时间,您可以使用以下内容:

  clock_t start, end;
  start = clock();

< your block(s) of code here>


  end = clock();
  printf("Time taken %lf\n", (double) (end-start) / CLOCKS_PER_SEC);

它给出了以秒为单位的时间。使用时间.h

为了查找内存消耗,您可以在运行进程时使用“top”检查相关字段。

【讨论】:

    【解决方案4】:

    如果您需要在您的程序、测试代码或日志中监控时间,您可以简单地使用 times() 或 clock() 。

    http://www.gnu.org/software/libc/manual/html_node/Processor-And-CPU-Time.html

    【讨论】:

      【解决方案5】:

      进行此类查询的最简单方法是:

      for (i = 100000000; --i >= 0; ){
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
          swap(&a, &b);
      }
      

      swap 是你要计时的函数,这段代码运行了 10^9 次。

      然后用你的手表计时。 所需的秒数转换为纳秒。

      【讨论】:

        【解决方案6】:

        对于像数字交换这样简单的函数,比较内存使用情况和速度的最简单方法可能是在调试器中查看代码。当您可以在原始 C 旁边看到优化的程序集时,您应该能够计算每个程序集的操作数(无法想象数字交换不仅仅是几条组装线)并很好地掌握哪种方法更快,并查看每个函数中涉及的寄存器数量,以决定哪种方法使用更多内存。但是,您不希望在大型函数上执行此操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 2011-04-24
          • 1970-01-01
          • 2016-01-30
          • 2021-06-09
          相关资源
          最近更新 更多