Bottleneck - C#代码瓶颈查找工具






3.56/5 (11投票s)
2002 年 5 月 15 日
3分钟阅读

92038

1496
一个简单的工具,可用于计时代码的不同部分执行所需的时间,以及瓶颈发生的位置
概述
目前,我一直在加速我的 C# 屏幕保护程序,并且我认为如果我知道我对代码耗时位置的假设是否正确,那将很有用。所以我写了这个小工具。一路走来,我玩了一些新的东西,比如哈希表、文件访问和我还没有做过的一些控件的东西。希望我能找到一些让你感兴趣的东西。
策略
基本上,这段代码的工作方式是创建一个类,该类封装一个字符串和保存有关我们函数数据的类实例之间的哈希表。哈希表和提供的函数将是静态的 - 我们不希望运行我们代码的多个实例。该类将具有开始和停止方法,除了确保没有交叉或无效调用之外,基本上只会在类对象中维护计时器,以跟踪我们在每个跟踪的函数中花费的时间。一个全局计时器将告诉我们代码运行了多长时间,以找出运行时间的百分比在我们正在跟踪的函数中。
C# 中的代码重用
为了构建主对象,我创建了一个新项目,并选择了类库选项。这将构建一个 dll 文件,可以通过从菜单中选择“项目 | 添加引用”将其添加到另一个项目。然后只需浏览到 dll 文件,它将被复制到您的本地目录中。请注意,只要您正在使用它,您就需要将此 dll 与您的程序一起分发。在这种情况下,它更像是一个调试工具,所以我希望你在测试完成后将其删除。
一个小问题。
我在编写这个工具时发现,如果我调用 DateTime.Now()
,运行一个小函数,然后再次调用它, DateTime2 - DateTime1
会给出一个负值。我不得不检查这一点,并记录 1 毫秒的时间来代替。
输出到磁盘
报告类有一个方法,它使用 StreamWriter
将报告写入文本文件。如果您不熟悉在 C# 中编写文本文件,您可能会发现检查它很有用。
Using the Code
提供了第二个项目,展示了如何使用该工具。首先,您需要添加提供的 dll,然后只需在要计时的函数的两端调用 CodeTimer.CodeTime.Start(FunctionName);
和 CodeTimer.CodeTime.Stop(FunctionName);
,并小心不要计时调用另一个正在计时的函数。目前,这些调用不会嵌套,并且该工具会检测到这一点并崩溃。 CodeTimer.CodeTime.Report();
调用可以由程序触发,也可以设置为在类被销毁时出现,从而在运行结束时生成报告。
摘要
本文的细节很少,只是因为我希望人们从该工具中获得的比代码更多,代码并没有那么复杂。解释了它的设置方式后,希望如果有让你感兴趣的东西,它会在代码中很清楚。否则,我希望该工具本身对您有用。