.NET 应用程序的性能改进过程是什么?
What is the performance improvement process for .NET applications?
我有一个 .NET 应用程序报告了性能问题。我之前关于如何提高性能的问题已关闭。评论告诉我,我没有正确进行性能测量,也没有遵循性能改进过程。
那么,该过程是什么?我该如何正确执行 .NET 性能测试?
So, what is that process and how do I perform a performance test for .NET correctly?
第一步:阅读@Eric Lippert
的性能文章
Benchmarking mistakes, part 1 大约是
- 错误 #1:选择错误的指标
- 错误 #2:以牺牲端到端性能为代价过分关注子系统性能
- 错误 #3:运行 调试器中的基准测试
- 错误 #4:对调试版本而不是发布版本进行基准测试
-
- 错误 #5:使用时钟而不是秒表
-
- 错误 #6:在衡量平均表现时将第一个 运行 视为没什么特别的
- 错误 #7:假设 运行一个环境中的时间特征告诉您在不同环境中会发生什么行为
-
- 错误 #8:忘记考虑垃圾回收的影响。
步骤 2:了解 Eric Lippert 的性能文章。再次阅读它们并弄清楚您将如何准确地将这些概念应用到您的程序中,IDE 等。您如何在发布模式下编译?你如何 运行 没有调试器?您如何实施时间测量?
第 3 步:制作清单以确保您遵循所有建议
第4步:获取你的性能性能要求。到底需要多快?在绝对值中,在哪个硬件上?
可以用你的机器做参考。但是我们需要知道那是什么机器才能了解它有什么特性(比如 CPU、缓存级别、turbo boost 激活与否、超线程激活与否)。
第 5 步:分析您的应用程序。使用合适的工具。
许多公司都将 JetBrains dotTrace 作为 Resharper Ultimate 的一部分。
第 6 步:分析结果。热点和瓶颈在哪里?你是怎么找到他们的?他们是由工具推荐的吗?如果有,是哪一个?
第 7 步:考虑可能的优化
将多线程引入之前的顺序问题可能会给您带来 8 倍的性能。更好的算法可以轻松为您带来 20 倍的性能(非多线程)。这一步要好好想想。
步骤 8:预测不同的选项。您希望每个选项的性能提升多少?
如果所有选项都没有达到所需的性能,您可能甚至不想开始接触代码。
第 9 步:设置版本控制,因为您将需要它。
参见第 13 步。您必须能够回滚。您可能会弄错多线程并出现数据竞争。您的优化结果可能比以前更糟。您必须能够回滚到干净的状态。
第 10 步:实施(下一个)最有希望的选项
步骤 11:验证结果,即再次配置文件(在同一台机器上,相同的设置,...)
第 12 步:将新结果与初始结果进行比较。
第13步: 好的保留,不好的回滚
第14步:如果达到性能目标:停止。如果不是,请返回步骤 7 或 8 并实施其他选项之一。
停止表示:不执行更多。您已达到要求。不要通过优化更多来浪费您的时间。 “过早的优化是万恶之源”[Donald Knuth]
My previous question on how to improve performance was closed.
在 Stack Overflow 上询问性能问题时:
- 证明您具备基本知识。
- 提供您遵守规则的证据(例如发布版本,...)。
- 提供您正在优化的指标。
- 提供您的硬件详细信息。
- 不要post一个link几百行代码。将受影响的代码减少到最少。
- 运行 最小化了 BenchmarkDotNet 中的代码,因为
- 开箱即用,它做了很多正确的事情(比如平均)
- 它是免费的,所以每个人都可以用它来验证你的结果
- 提供数字 - 第 4、5 和 11 步中的所有数字 (!)。
我有一个 .NET 应用程序报告了性能问题。我之前关于如何提高性能的问题已关闭。评论告诉我,我没有正确进行性能测量,也没有遵循性能改进过程。
那么,该过程是什么?我该如何正确执行 .NET 性能测试?
So, what is that process and how do I perform a performance test for .NET correctly?
第一步:阅读@Eric Lippert
的性能文章Benchmarking mistakes, part 1 大约是
- 错误 #1:选择错误的指标
- 错误 #2:以牺牲端到端性能为代价过分关注子系统性能
- 错误 #3:运行 调试器中的基准测试
- 错误 #4:对调试版本而不是发布版本进行基准测试
-
- 错误 #5:使用时钟而不是秒表
-
- 错误 #6:在衡量平均表现时将第一个 运行 视为没什么特别的
- 错误 #7:假设 运行一个环境中的时间特征告诉您在不同环境中会发生什么行为
-
- 错误 #8:忘记考虑垃圾回收的影响。
步骤 2:了解 Eric Lippert 的性能文章。再次阅读它们并弄清楚您将如何准确地将这些概念应用到您的程序中,IDE 等。您如何在发布模式下编译?你如何 运行 没有调试器?您如何实施时间测量?
第 3 步:制作清单以确保您遵循所有建议
第4步:获取你的性能性能要求。到底需要多快?在绝对值中,在哪个硬件上?
可以用你的机器做参考。但是我们需要知道那是什么机器才能了解它有什么特性(比如 CPU、缓存级别、turbo boost 激活与否、超线程激活与否)。
第 5 步:分析您的应用程序。使用合适的工具。
许多公司都将 JetBrains dotTrace 作为 Resharper Ultimate 的一部分。
第 6 步:分析结果。热点和瓶颈在哪里?你是怎么找到他们的?他们是由工具推荐的吗?如果有,是哪一个?
第 7 步:考虑可能的优化
将多线程引入之前的顺序问题可能会给您带来 8 倍的性能。更好的算法可以轻松为您带来 20 倍的性能(非多线程)。这一步要好好想想。
步骤 8:预测不同的选项。您希望每个选项的性能提升多少?
如果所有选项都没有达到所需的性能,您可能甚至不想开始接触代码。
第 9 步:设置版本控制,因为您将需要它。
参见第 13 步。您必须能够回滚。您可能会弄错多线程并出现数据竞争。您的优化结果可能比以前更糟。您必须能够回滚到干净的状态。
第 10 步:实施(下一个)最有希望的选项
步骤 11:验证结果,即再次配置文件(在同一台机器上,相同的设置,...)
第 12 步:将新结果与初始结果进行比较。
第13步: 好的保留,不好的回滚
第14步:如果达到性能目标:停止。如果不是,请返回步骤 7 或 8 并实施其他选项之一。
停止表示:不执行更多。您已达到要求。不要通过优化更多来浪费您的时间。 “过早的优化是万恶之源”[Donald Knuth]
My previous question on how to improve performance was closed.
在 Stack Overflow 上询问性能问题时:
- 证明您具备基本知识。
- 提供您遵守规则的证据(例如发布版本,...)。
- 提供您正在优化的指标。
- 提供您的硬件详细信息。
- 不要post一个link几百行代码。将受影响的代码减少到最少。
- 运行 最小化了 BenchmarkDotNet 中的代码,因为
- 开箱即用,它做了很多正确的事情(比如平均)
- 它是免费的,所以每个人都可以用它来验证你的结果
- 提供数字 - 第 4、5 和 11 步中的所有数字 (!)。