特定例程的绩效指标:任何最佳实践?

时间:2008-11-13 15:39:26

标签: optimization performance

我想收集有关我的代码的特定例程的指标,以了解我可以在哪里进行最佳优化。让我们举一个简单的例子,说我有一个带有多个“学生”的“班级”数据库。假设当前代码为每个学生调用数据库,而不是一次性地将它们全部抓取。我想看看每个学生行每次旅行需要多长时间。

这是在C#中,但我认为它适用于所有地方。通常当我对特定例程的性能感到好奇时,我会在它运行之前创建一个DateTime对象,运行例程,然后在调用之后创建另一个DateTime对象,并获取两者之间的毫秒差异以查看它运行了多长时间。通常我只是在页面的跟踪中输出它...所以它有点低保真。这方面的最佳做法是什么?我想过能够将Web应用程序置于某种“诊断”模式并使用我之后的任何内容进行详细的日志记录/事件日志写入,但我想看看stackoverflow hive mind是否有更好的想法。

8 个答案:

答案 0 :(得分:3)

对于数据库查询,您有两个小问题。缓存:数据缓存和语句缓存。

如果您运行一次查询,则会解析,准备,绑定和执行该语句。数据从文件中提取到缓存中。

第二次执行查询时,会使用缓存,性能通常要好得多。

哪个是“真正的”演出号码?第一个还是第二个?有些人说“最坏情况”是实数,我们必须优化它。其他人说“典型案例”并运行查询两次,忽略第一个。其他人说“平均”并且运行30次,平均所有。其他人说“典型的平均值”,运行31次并平均最后30次。

我建议“31的最后30个”是最有意义的数据库性能数字。不要为你无法控制(解析,准备,绑定)时间的东西流汗。冒汗你可以控制的东西 - 数据结构,I / O加载,索引等。

答案 1 :(得分:2)

我偶尔使用这种方法并发现它相当准确。问题是,在具有大量调试日志的大型应用程序中,在日志中搜索此信息可能会很麻烦。所以我使用外部工具(我主要使用Java编程,并使用JProbe),它允许我查看我的方法的平均和总时间,特定方法花费的时间(与方法花费的累计时间相反)以及它调用的任何方法,以及内存和资源分配。

这些工具可以帮助您衡量整个应用程序的性能,如果您在性能很重要的领域进行大量开发,您可能需要研究可用的工具并学习如何使用它。 / p>

答案 2 :(得分:1)

有一些Profilers可用,但坦率地说,我认为你的方法更好。分析器方法过度。如果你完全不知道瓶颈在哪里,也许使用分析器是值得的。我宁愿花一点时间预先分析问题并提出一些战略性的打印陈述,而不是弄清楚如何检测你的应用程序进行分析,然后倒出庞大的报告,其中每个可执行的代码行都是定时的。

答案 3 :(得分:1)

如果您正在使用.NET,那么我建议您查看Stopwatch课程。您从中获得的时间将比使用DateTime的等效样本更准确。

我还建议您查看ANTS Profiler表示性能特别重要的情况。

答案 4 :(得分:1)

值得考虑投资一个好的商业分析师,特别是如果你曾经期望第二次这样做。

我使用的那个JProfiler在Java世界中工作,可以连接到已经运行的应用程序,因此不需要特殊的工具(至少使用更新的JVM)。

它可以非常快速地在您的代码中构建一个排序的热点列表,显示您的代码在大部分时间内花费的方法。它默认情况下非常智能地过滤,并允许您根据需要进一步调整过滤,这意味着您可以忽略第三方库的详细信息,同时选择那些一直在进行的方法。

此外,您还可以获得有关代码正在执行的操作的大量其他有用报告。它是在我第一次使用它的时候支付了许可证的费用;我没有必要添加大量的日志记录语句并构建一个机制来分析输出:探查器的开发人员已经为我做了所有这些。

除了作为一个非常满意的客户之外,我不会以任何方式与ej-technologies联系。

答案 5 :(得分:1)

有时您接受的方法会让您最好地了解您的应用程序性能。 我可以推荐的一件事是使用System.Diagnostics.Stopwatch而不是DateTime, DateTime的精确度最高可达16毫秒,其中秒表精确到cpu tick。

但我建议使用自定义性能计数器来补充它,以便在开发过程中在profiler下生成和运行应用程序。

答案 6 :(得分:0)

我使用这种方法,我认为它非常准确。

答案 7 :(得分:0)

我认为你有一个很好的方法。我建议您在日志文件中生成“机器友好”记录,以便您可以更轻松地解析它们。像CSV或其他分隔记录一样的结构。

相关问题