如何调试应用程序的性能

在这里插入图片描述
对于许多企业来说,应用程序性能可能是一个关键问题。毕竟,服务器托管成本直接影响您的底线,因此使用性能分析工具来调试您运行的代码最终可以为您节省资金。

要寻找什么问题

“瓶颈”是应用程序的任何缓慢部分,它会减慢其他速度更快的代码的速度,就像水瓶上的盖子或阻碍交通的狭窄道路一样。您编写的任何代码都可能在某处存在瓶颈,无论它们是大是小,您都可以使用性能分析工具来识别它们。

每个程序都不同,但许多应用程序都会遇到很多相同的问题:

  • 函数调用过于频繁(缓存或调度会减少调用次数)
  • IO 阻塞代码,通常是同步磁盘访问,但也有过多的内存使用。
  • 使用昂贵方法的大型循环。
  • 启动时间长,尤其是在 JIT 编译语言中。
  • 不必要的内存分配,尤其是在带有垃圾收集器的运行时。
  • 可从并行化或异步编程中受益的领域。

在使用分析器检查代码时,您需要留意其中的任何一个。即使您的应用程序没有严重、明显的瓶颈,任何百分比的改进都可以帮助您的应用程序运行得更快、更高效,并且随着时间的推移,这里和那里的几个百分点的速度提高可能会增加很多。

还有一种可能性是,您的应用程序的瓶颈不是因为服务器上运行的代码,而是因为它在整个网络中的位置。例如,如果您有一个 API 应用程序连接到一个缓慢的数据库,那么 Web 服务器的速度有多快并不重要,因为它总是在等待缓慢的结果。性能分析器只会帮助您调试代码中的问题,而不是您的整体网络架构。

分析如何工作?

性能分析工具在几个方面不同于调试工具。IDE 使用调试工具(如断点和检查)来测试和解决开发中的问题。分析器通常在假设您不知道问题是什么的情况下运行,并希望分析您的所有代码以找到它。分析器与您的应用程序挂钩,并使用高精度计时器来跟踪哪些函数花费的时间最长。运行一段时间后,您将有足够的数据来追踪导致问题的原因。
大多数分析器将按最高时间消费者排序的堆栈显示数据。大多数分析器中的常见图形是火焰图——显示整个程序调用历史的直观细分。

在这里插入图片描述
您使用的确切工具和方法将根据您要分析的语言或运行时以及您是否需要在生产环境中分析应用程序而有所不同,但总体思路是相同的。

因为每个探查器都需要与正在运行的代码集成,所以您需要为应用程序使用的语言下载探查器。有些比其他的更容易使用,特别是对于像 C# 和 Java 这样的语言,它们比编译语言更容易注入到应用程序中。

许多 IDE 还将在标准调试工具集之上内置分析工具,您也可以使用这些工具。例如,Visual Studio 可以在许多应用程序中分析性能和内存使用情况。

  1. Java – JProfiler、IDEA/Eclipse/Netbeans IDE
  2. Python – cProfiler , Palanteer
  3. JavaScript – Chrome 开发者工具
  4. C# – dotTrace,Visual Studio IDE
  5. C、C++—— 轨道

如果您知道什么可能需要一段时间,您可以随时使用秒表计时器库来运行基准测试。
在这里插入图片描述
例如,Benchmark.NET可以以非常高的准确度对不同的函数运行测试,并且通常用于对不同的算法进行基准测试。您还可以在Stopwatch 要进行基准测试的代码周围使用简单的代码。

使用性能分析器

在本指南中,我们将展示如何使用dotTrace,这是一种用于 .NET 应用程序的性能分析器,功能齐全,并具有其他分析器中的大多数工具。除非您分析 C# 代码,否则您可能会使用不同的应用程序,但整体过程应该是相似的。

打开应用程序后,您将能够连接到正在运行的 .NET 进程,或设置您自己的运行配置,以便您可以从 dotTrace 启动应用程序。从分析器启动应用程序对于调试缓慢的启动时间特别有用。
在这里插入图片描述
运行该应用程序后,它将开始收集数据。您可以根据需要运行它,只需按“获取快照并等待”即可打开收集的时间段的分析。

在这里插入图片描述
打开后,您会在调用堆栈和调用树旁边看到许多图表,这可能看起来难以理解。如果您看到很多与线程、锁和等待相关的内容,那可能是因为您需要将范围限定为“主线程”。

探查器选取所有线程,这些线程通常用于将等待很长时间的后台任务。虽然这些可能是 IO 阻塞问题的证据,但它比分析器所描述的更微妙,这实际上取决于线程在做什么。
在这里插入图片描述
dotTrace 还具有根据代码来自的工作领域过滤代码的功能,使用左侧的“子系统”过滤器。系统代码、本机代码和其他滞后区域,如反射、集合、字符串和 LINQ,都可以搜索。
在主窗口中,您将找到火焰图。这显示了整个应用程序的细分,从“所有调用”开始,细分了执行每个级别的函数所需的时间。有些将无法解析,有些将太小而无法在此处显示,但此图可以放大到任何函数以查看该调用堆栈的更详细细分。

在这里插入图片描述
性能分析器的另一个主要功能是调用树,它显示了最活跃函数的嵌套细分,按执行时间排序。在这里,dotTrace 还显示了一个百分比,它表示给定函数及其子函数占用的总时间块。

在这里插入图片描述
花在函数上的 CPU 时间并不总是问题,特别是对于像 C# 这样带有垃圾收集器的语言。dotTrace 还跟踪内存使用和分配情况,可用于查找对 GC 施加不必要压力的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikes zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值