【发布时间】:2010-12-14 13:02:56
【问题描述】:
我在我的 c 程序中使用 gcc。如何检查哪种方法更快(假设我编写了一个代码来交换两个数字并使用位运算符重写了相同的代码),linux中有没有工具可以检查时间、性能和空间?
【问题讨论】:
-
我不知道你说的空间是什么意思?你指的是内存分配吗?
-
是的,彼得空间(内存)
标签: c linux performance gcc profiling
我在我的 c 程序中使用 gcc。如何检查哪种方法更快(假设我编写了一个代码来交换两个数字并使用位运算符重写了相同的代码),linux中有没有工具可以检查时间、性能和空间?
【问题讨论】:
标签: c linux performance gcc profiling
man gprof 应该会有所帮助。
但请记住,如果您使用分析器,您应该测试大量循环。 并且您应该在计算缓存效果的情况下执行此操作,因此至少应该在足够大的内存区域数据上以随机(但相同)的顺序执行此操作。为此使用 srandom() / random()。
最小设置:
【讨论】:
在你描述的简单情况下,我会使用这个
$ 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 工具可以自动检测许多内存管理和线程错误,并详细分析您的程序。
【讨论】:
要查找代码所花费的时间,您可以使用以下内容:
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”检查相关字段。
【讨论】:
如果您需要在您的程序、测试代码或日志中监控时间,您可以简单地使用 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 旁边看到优化的程序集时,您应该能够计算每个程序集的操作数(无法想象数字交换不仅仅是几条组装线)并很好地掌握哪种方法更快,并查看每个函数中涉及的寄存器数量,以决定哪种方法使用更多内存。但是,您不希望在大型函数上执行此操作。
【讨论】: