C代码的性能

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

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

$ vi test.c $ make test cc test.c -o test $ time ./test real 0m1.001s user 0m0.001s sys 0m0.000s 

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

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

有一个名为Valgrind ( 维基百科 )的工具,我建议你也看看。

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

男人gprof应该帮助。

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

最小设置:

  • 写'测试床',通过相同的输入循环不同的方法(足够大的循环)。
  • 编译/链接你的模块与GNU编译器-pg选项。
  • 跑。 您应该获得配置文件数据文件(通常是gmon.out)。
  • man gprof – > gprof [options] – >生成你需要的报告 – >看看你真正需要什么。

为了找到你的代码所花费的时间,你可以使用这样的东西:

  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); 

它提供了几秒钟的时间。 使用time.h

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

如果您需要在程序中或者在测试代码中记录时间,则可以简单地使用times()或clock()。

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

做这样的查询最简单的方法是这样的:

 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次。

然后,只要你的手表。 它需要的秒数转换为纳秒。

有一个像数字交换一样简单的函数,比较内存使用和速度的最简单方法可能是在调试器中查看代码。 当你可以看到与原始C一起的优化程序集时,你应该能够计算每个程序集的汇编操作(无法想象一个数字交换不止一条汇编行),并且能够很好地处理哪个方法更快,并查看每个函数中涉及的寄存器的数量,以决定哪个方法使用更多的内存。 但是,你不想在大功能上做到这一点。