功能性能测试

时间:2009-12-30 02:38:42

标签: c

linux gcc 4.4.1 C99

我想知道测试C程序性能的最佳方法是什么。

我有一些我已经实现的功能。但是,我可以为每个功能使用不同的设计。

基本上,我应该测试看看哪种设计可以提供更好的性能。

非常感谢,

6 个答案:

答案 0 :(得分:4)

在代码分析器上查看this post

答案 1 :(得分:3)

  

我想测试哪种设计可以提供更好的性能。

为什么重要?这不是一个翻转问题!您应该考虑到性能目标,如果您满足它,您的代码就足够快了。

你怎么知道“足够快”的速度有多快?事实证明,用户界面的人员可以获得有关响应时间对用户体验影响的良好数据:

  • 0.1秒大约是让用户感觉系统瞬间响应的限制,这意味着除了显示结果之外不需要特殊反馈。 (大多数人的反应时间约为0.1秒;喷气式战斗机飞行员的速度降至0.08秒左右,即80毫秒。)

  • 即使用户会注意到延迟,1秒也是关于用户思维保持不间断的限制。通常情况下,在超过0.1秒但不到1.0秒的延迟期间不需要特殊反馈,但用户确实失去了直接“驱动”您的应用程序的感觉。

  • 10秒就是将用户的注意力集中在应用上的极限。对于较长的延迟,用户将希望在等待计算机完成时执行其他任务,因此应该给出反馈,指示计算机何时完成。如果响应时间难以预测或变化很大,延迟期间的反馈尤其重要。

上述定量结果当然仅适用于相互作用,以等待时间的秒数来衡量。但即使您的目标是发送的网络数据包,分配的RAM页面,读取/写入的磁盘块,或者只消耗功率,我尝试通信的消息是您应该具有性能目标,该目标应量化目标应与用户的需求相关联。如果你没有可量化的目标,你就不会做工程;你只是在黑暗中吹口哨。除非你的目标是教育自己(或满足空闲的好奇心),否则你应该问的问题是“我的代码是否足够好以至于我可以继续前进?”


如果您没有达到目标,或者您正在尝试自学,我认为可读和详细信息的最佳组合来自于使用valgrind探查器(--tool=callgrind --dump-instr=yes)使用kcachegrind可视化工具。

答案 2 :(得分:2)

大多数情况下,您想使用分析器。弗拉格斯沃思指出的这个职位是一个良好的开端。就个人而言,我更喜欢Shark用于Mac OS X,而gprof用于Linux。

但在你的情况下,你也可以用这种方式调用clock()或getrusage():

clock_t t = clock();
for (i = 0; i < 1000; ++i) my_func();
printf("time = %lf\n", (double)(clock() - t) / CLOCKS_PER_SEC);

当您想要挖掘代码的哪一部分花费大部分时间时,Profiler非常有用。当你想要比较/基准测试不同的实现时,调用clock()/ getrusage()对我来说更方便。

答案 3 :(得分:1)

要弄清楚的第一件事是你是否需要优化这些功能。除非它们处于代码的关键路径中,否则它们可能会更快。

如果您已经对应用程序进行了分析并发现它们很慢,那么测试性能的一个好方法是调用该函数很多次并找出运行所需的平均时间。

您还应该尝试使用CPU时间而不是使用时钟,因为这是一个更准确的衡量标准。

答案 4 :(得分:1)

您可以使用gprof,这是一个免费的探查器。

答案 5 :(得分:0)

除了分析之外,您还需要从线束(驱动程序)运行测试中的代码以平均读数。通过这种方式,您的比较不会受到一次读数的影响,因此您需要使用平均值和标准差进行比较的大样本总数。有许多多线程框架可以为您实现负载驱动。