C代码的性能

发布于 2024-08-10 07:05:59 字数 98 浏览 5 评论 0 原文

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

I'm using gcc for my c programmes. How can I check which method is faster (suppose that I write a code to swap two numbers and I rewrote the same code using bit operator), is there any tool in linux to check the time,performance and space?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

吾性傲以野 2024-08-17 07:05:59

man gprof 应该有帮助。

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

最小设置:

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

man gprof should help.

But remember, if you use profiler you should test large number of loops.
And you should do it with caching effect counted so at least this should be performed on large enough memory area data with random (but the same) order. Use srandom() / random() for this.

Minimal setup:

  • write 'test bed' which loops different methods through the same input (large enough loops).
  • compile / link your modules with GNU compiler -pg option.
  • run. You should obtain profile data file (gmon.out usually).
  • man gprof -> gprof [options] -> produce reports you need -> see what you really need.
初见 2024-08-17 07:05:59

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

$ 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 的工具(维基百科)我推荐你也看看。

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

In the simple case you describe i'd use this

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

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

When comparing the full execution of several components i'd use the gprof method outlined by Roman.

It all depends on the situation. But 9 times out of 10 the time approach is sufficient to me. But i suppose when working with threads multiple processes and GUI code the situation would be different. That is however not my field of expertise.

There is a tool called Valgrind (wikipedia) that i recommend you too have a look at.

There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail.

梦醒灬来后我 2024-08-17 07:05:59

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

  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”检查相关字段。

For finding the time taken by your code, you could use something like this:

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

It gives the time taken in seconds. Uses time.h

For finding the memory consumptions, you can check the relevant field using 'top' when you run the process.

几度春秋 2024-08-17 07:05:59

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

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

If you need to monitor time within your program, or in a test code or log it, you can simply use times() or clock() .

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

无戏配角 2024-08-17 07:05:59

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

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

然后用手表计时即可。
所花费的秒数转换为纳秒。

The simplest way to do such a query is this:

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

where swap is the function you want to time, this code runs it 10^9 times.

Then just time it with your watch.
The number of seconds it takes translates to nanoseconds.

誰ツ都不明白 2024-08-17 07:05:59

对于像数字交换这样简单的函数,比较内存使用情况和速度的最简单方法可能是查看调试器中的代码。当您可以看到优化后的汇编与原始 C 一起时,您应该能够计算每个汇编操作的数量(无法想象数字交换会超过少数汇编线)并很好地掌握哪种方法更快,并查看每个函数中涉及的寄存器数量来决定哪个方法使用更多内存。但是,您不想在大型函数上执行此操作。

With a function as simple as a number swap, the easiest way to compare memory usage and speed might be to look at the code in a debugger. When you can see the optimized assembly alongside the original C, you should be able to count assembly operations for each (can't imagine a number swap being more than a handful of assembly lines) and get a good handle on which method is faster, and look at the number of registers involved in each function to decide which method uses more memory. You wouldn't want to do this on large functions, however.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文