如何在C ++代码中找到性能瓶颈

时间:2009-10-04 05:37:02

标签: c++ performance optimization

我有一个用C ++编写的服务器应用程序,并部署在Cent OS中。我没有编写其代码的任何部分,但我需要优化其性能。它的当前性能对于少量用户来说是可以接受的,但是当用户数量增加时,服务器的性能会急剧下降。

是否有任何工具,技术或最佳做法可以找出瓶颈?

4 个答案:

答案 0 :(得分:14)

人们通常使用分析器来确定性能瓶颈。早期要求C ++剖析器的SO问题是herehere(取决于您使用的操作系统和编译器)。对于Linux,人们通常使用gprof,因为它附带了系统。

答案 1 :(得分:3)

如果您没有

,那么首先要构建一个性能测试环境
  • 生产级硬件。如果你没有这方面的预算,你也可以放弃。
  • 驱动程序或硬件设备,以高速生产类似生产的流量 - 快于或快于生产。根据您的协议和用例,这可能很容易或很困难。一种技术是从生产中抽取一些请求并重放它们 - 但这可能会产生不切实际的结果,因为它会提供更高的缓存命中率。
  • 周围的基础设施与您可以合理获得的生产相似

然后重现问题,因为它存在于生产中。完成后,然后使用分析器等,正如其他人所建议的那样。

答案 2 :(得分:1)

答案 3 :(得分:1)

我喜欢,MIke Dunlavey上面的回答(如果你上升我的话,那么就会上升)

我想用两种方法匆忙制定一个人:

  • gcc用户在gstack
  • 中进行抽样的快捷方式
  • 使用SIGALRM结合backtrace进行自我检查(由您自己的计时器驱动)。

就在几天前,我做了类似的事情

# while true; do gstack $MYPID; sleep 2; done | logger $PARAMS

使用符合我的系统日志路由规则的PARAMS,以便我的应用程序日志与堆栈混合(不是与事件完美匹配)

结果是在鼻子上,他们指出我认为可能是一个问题的区域,但由于misuse of reference in a tr1::bind

是我的瓶颈

在闹钟方法中要小心你在信号中做什么,不要使用任何分配内存的东西(没有cout / cerr / boost,只使用简单的格式(即“%08X”和printf)