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

如何在C++;代码 我有一个C++应用程序,并部署在TealOS中。我还没有编写它的任何代码,但我需要优化它的性能。它当前的性能对于少数用户来说是可以接受的,但是当用户数量增加时,服务器的性能会急剧下降,c++,performance,optimization,C++,Performance,Optimization,是否有任何工具、技术或最佳实践可以找出瓶颈?人们通常使用探查器来确定性能瓶颈。较早的,所以询问C++剖析器的问题是(取决于操作系统和编译器)。对于Linux,人们通常使用gprof,因为它是随系统提供的。如果没有性能测试环境,您将从构建性能测试环境开始 生产级硬件。如果你没有这方面的预算,你不妨放弃 驱动程序或硬件设备,以高速率向其发送生产流量,与生产速度相同或更快。根据您的协议和用例,这可能是容易的,也可能是困难的。一种技术是对生产环境中的一些请求进行采样并重播,但这可能会产生不切实际的结果

是否有任何工具、技术或最佳实践可以找出瓶颈?

人们通常使用探查器来确定性能瓶颈。较早的,所以询问C++剖析器的问题是(取决于操作系统和编译器)。对于Linux,人们通常使用gprof,因为它是随系统提供的。

如果没有性能测试环境,您将从构建性能测试环境开始

  • 生产级硬件。如果你没有这方面的预算,你不妨放弃
  • 驱动程序或硬件设备,以高速率向其发送生产流量,与生产速度相同或更快。根据您的协议和用例,这可能是容易的,也可能是困难的。一种技术是对生产环境中的一些请求进行采样并重播,但这可能会产生不切实际的结果,因为它会提供更高的缓存命中率
  • 周围的基础设施尽可能与生产类似

然后重现生产中存在的问题。一旦你做到了这一点,然后像其他人建议的那样使用剖析器等。

我喜欢上面迈克·邓拉维的答案(如果你把我的答案加上去,那么就加上他的)

我想用两种方法为匆忙中的人详细说明:

  • gcc
    用户在
    gstack
  • 使用
    SIGALRM
    结合
    backtrace
    (由您自己的计时器驱动)进行自检

就在几天前,我做了这样的事情

# while true; do gstack $MYPID; sleep 2; done | logger $PARAMS
使用符合我的系统日志路由规则的参数,以便我的应用程序日志与堆栈混合(不是事件的完美组合)

结果令人惊讶,他们指出了一个我认为可能会成为问题的领域,但这是我的瓶颈所在


在报警方法中,注意在信号中所做的操作,不要使用任何分配内存的东西(没有cout/cerr/boost,只使用简单的格式(即带有printf的“%08X”)

+1关于如何重现性能问题的评论很好。探查器很棒,但显然不适合在生产系统上使用。您需要首先在非生产系统上重现问题。实际上,您不需要在开发系统上看到问题。相反,探查器可能会告诉您这是一个重要部分即使您没有意识到这是一个“长”的过程,也会花费大量的运行时间。当然,还有一些其他问题(例如数据库性能)对应用程序的评测没有帮助。