功能性能测试
Posted
技术标签:
【中文标题】功能性能测试【英文标题】:performance test of functions 【发布时间】:2009-12-30 02:38:42 【问题描述】:linux gcc 4.4.1 C99
我想知道测试 C 程序性能的最佳方法是什么。
我已经实现了一些功能。但是,我可以为每个功能使用不同的设计。
基本上,我应该测试一下哪种设计能提供更好的性能。
非常感谢,
【问题讨论】:
程序通常将 90% 的时间花在 10% 的代码上。先找到 10%,让你的工作轻松十倍。 【参考方案1】:在代码分析器上查看this post。
【讨论】:
【参考方案2】:我想测试一下哪种设计的性能更好。
为什么重要?这不是一个翻转的问题!你应该有一个性能目标,如果你达到了,你的代码就足够快了。
你怎么知道“足够快”有多快?事实证明,用户界面人员对响应时间对用户体验的影响有很好的数据:
0.1 秒大约是让用户感觉到系统正在即时做出反应的限制,这意味着除了显示结果之外不需要特殊的反馈。 (大多数人的反应时间约为 0.1 秒;喷气式战斗机飞行员的反应时间降至 0.08 秒左右,即 80 毫秒。)
1 秒大约是用户思维流保持不间断的极限,即使用户会注意到延迟。通常情况下,在超过 0.1 秒但小于 1.0 秒的延迟期间不需要特殊的反馈,但用户确实会失去直接“驱动”您的应用程序的感觉。
10 秒大约是让用户的注意力集中在应用程序上的限制。对于较长的延迟,用户将希望在等待计算机完成时执行其他任务,因此应向他们提供反馈,指示计算机预计何时完成。如果响应时间难以预测或变化很大,则延迟期间的反馈尤为重要。
上面的定量结果当然只适用于交互,它以等待时间的秒数来衡量。但是,即使您的目标是发送的网络数据包、分配的 RAM 页面、读取/写入的磁盘块,或者只是消耗的功率,我想要传达的信息是 您应该有一个性能目标,该目标应该是量化的,并且目标应该与用户的需求相联系。如果你没有一个可量化的目标,你就不是在做工程;你只是在黑暗中吹口哨。除非您的目标是自学(或满足闲散的好奇心),否则您应该问的问题是“我的代码足够好,可以继续前进吗?”
如果你没有达到你的性能目标,或者你想自学,我认为最好的可读性和详细信息组合来自使用valgrind分析器(--tool=callgrind --dump-instr=yes
)和@987654323 @可视化器。
【讨论】:
-1:您只回答了用户界面。这个问题没有提到用户界面。 “性能”可能意味着 UI 体验,但也可能意味着总时间、使用的内存、使用的带宽或许多其他因素。 @Chip:好点。我试图使用用户界面细节来说明关于性能工作的一般观点。我已经编辑了答案,以使一般观点更加具体。感谢批评。 好多了!删除了-1。感谢您提供额外的段落。【参考方案3】:大多数情况下,您希望使用分析器。 Fragsworth 指出的帖子是一个好的开始。就个人而言,我更喜欢 Mac OS X 的 Shark,以及 Linux 的 gprof。
但在你的情况下,你也可以调用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() 更方便(对我而言)。
【讨论】:
【参考方案4】:您可以使用 gprof,它是一个免费的分析器。
【讨论】:
【参考方案5】:首先要弄清楚是否需要优化这些功能。除非它们在您的代码的关键路径中,否则它们可能足够快。
如果您分析过您的应用程序并发现它们运行缓慢,那么测试性能的一种好方法是多次调用该函数并找出运行所需的平均时间。
您还应该尝试使用 CPU 时间而不是挂钟时间,因为这样更准确。
【讨论】:
【参考方案6】:除了分析之外,您还需要从线束(驱动程序)运行被测代码以平均读数。通过这种方式,您的比较不会因一次性读数而出现偏差,因此您有大量的样本群体,其中包含要比较的平均值和标准偏差。有很多多线程框架可以为你实现负载驱动。
【讨论】:
以上是关于功能性能测试的主要内容,如果未能解决你的问题,请参考以下文章