那么,这个过程是什么?如何正确执行 .NET 的性能测试?
第一步:阅读@Eric Lippert的性能文章
第 2 步:理解 Eric Lippert 的表演文章。再次阅读它们,并弄清楚您将如何将这些概念准确地应用于您的程序、IDE 等。您如何在发布模式下编译?没有调试器如何运行?您如何实施时间测量?
第 3 步:制作清单以确保您遵循所有建议
第 4 步:获取您的性能性能要求。它到底需要多快?以绝对值表示,在哪个硬件上?
可以使用您的机器作为参考。但我们需要知道是什么机器才能了解它具有哪些功能(例如 CPU、缓存级别、涡轮增压是否启用、超线程是否启用)。
第 5 步:配置您的应用程序。使用适当的工具。
许多公司都将 JetBrains dotTrace 作为 Resharper Ultimate 的一部分。
第 6 步:分析结果。热点和瓶颈在哪里?你是怎么找到他们的?他们是由工具建议的吗?如果有,是哪一个?
第 7 步:考虑可能的优化
将多线程引入到以前的顺序问题可能会给您带来 8 倍的性能。更好的算法可以轻松为您带来 20 倍的性能(非多线程)。在这一步中认真思考。
第 8 步:预测不同的选项。您期望每个选项的性能提升多少?
如果所有选项都没有达到所需的性能,您甚至可能不想开始接触代码。
第 9 步:设置版本控制,因为您需要它。
请参见第 13 步。您必须能够回滚。您可能会弄错多线程并进行数据竞争。您的优化结果可能比以前更糟。您必须能够回滚到干净状态。
第 10 步:实施(下一个)最有希望的选项
第 11 步:验证结果,即再次配置文件(在同一台机器上,相同的设置,...)
第 12 步:将新结果与初始结果进行比较。
第 13 步:如果更改好则保留更改,否则回滚。
第 14 步:如果达到性能目标:停止。如果不是,请返回第 7 步或第 8 步并实施其他选项之一。
停止意味着:不再执行。您已达到要求。不要通过优化更多来浪费您的时间。 “过早的优化是万恶之源”[Donald Knuth]
我之前关于如何提高性能的问题已结束。
在 Stack Overflow 上询问性能问题时:
- 提供证据证明您具备基本知识。
- 提供证据证明您遵守了规则(例如发布版本,...)。
- 提供您正在优化的指标。
- 提供您的硬件详细信息。
- 请勿发布数百行代码的链接。将受影响的代码减少到最低限度。
- 在BenchmarkDotNet 中运行最小化的代码,因为
- 开箱即用,它做了很多正确的事情(例如平均)
- 它是免费的,因此每个人都可以使用它来验证您的结果
- 提供数字 - 步骤 4、5 和 11 中的所有数字 (!)。