性能分析与日志记录有何不同?
它们的区别仅在于性能分析用于测量每个函数所需的时间来进行性能评估吗?还是我理解偏了?
通常,性能分析库如何使用?
通过性能分析可以获得哪些类型的统计信息?
日志记录告诉您发生了什么。它非常适用于取证和调试。
性能分析量化了代码的执行情况:它告诉您代码在每个区域花费了多少时间,或者某段代码被执行了多少次。它有助于提高代码的性能。
性能分析通常在代码行、函数调用或有时文件级别上运行。对于每个级别,它通常可以告诉您:
单元被执行了多少次。通常优化不经常使用的代码比执行数百万次的代码更不重要。一个例外是使用户(或另一个进程)等待其完成的代码。
分支被采取的次数,例如在一个if
或switch
语句中。同样,通常最关心优化经常使用的代码。
在一个特定的函数中花费了多少时间。警告:即使是经验丰富的开发人员,也经常会对这些结果感到惊讶。很难预测您的"时间沉没"在哪里。
在一个函数及其所有被调用的函数中花费了多少时间。也许不是这个函数本身,而是它的子函数需要优化。
每个调用者调用了单元的次数。您可能会发现一个特定的函数主要是从一个意想不到的地方调用的。
凭借来自良好分析器的数据,您通常可以在相对较小的工作量下获得显著的性能改进。
性能分析是关于确定与函数/方法调用相关的性能,例如:
整个性能分析的想法是获取系统的全面概述,以确定可以进行优化的位置。如果您知道一个特定的函数被调用的次数比第二个最高调用的函数多20次,那么您就知道何时集中优化工作。
它还向您展示了不需要花费时间的地方。您不希望花费一天的时间来优化每小时只被调用一次的函数。您要将时间集中在优化那些每秒钟被调用多次的函数上。
日志记录,在我看来,只是跟踪已经被调用的内容(但没有与每个调用相关的详细元数据)。
性能分析库(如Rational Quantify)通过对代码进行插桩来收集运行时的统计信息。这将具有隐含的性能影响,但它将相对于系统而言。
Profiling被用来确定程序的运行时效率。它可以用于测量内存使用或CPU使用率。您可以使用它来优化您的代码。
另一方面,Logging是一个审计功能。您想看到程序在运行时做了什么。它更多地用于调试而不是性能。
我认为性能分析是一种性能测量方法,你不必对每个运行的代码进行分析,有时候针对特定区域进行分析会更好。
日志记录是将信息存储以备后用,这些信息可能与性能分析有关,但不一定如此。它可能只是记录发生了什么。
我使用过的所有性能分析工具基本上都允许您为“事务”存储开始时间和结束时间,并稍后操作数据以查看哪些部分需要最长时间。
日志语句通常是直接写在源代码中的,而使用分析可以在编译后修改代码,然后仅用于分析会话(即,在任何版本的构建本身中都没有分析代码)。可以实时测量性能,也可以进行采样以以更少的干扰方式跟踪性能。
日志记录可以告诉你在stackoverflow上发布了多少个问题。
性能分析可以告诉你每个问题发布需要多长时间,以及你在这里花费了多少工作时间。
之前的回答都是正确的。
然而,在我看来,性能分析工具更多的是虚晃一枪,我敢打赌这会让某些人误入歧途。
如果你想知道一个函数占用了多少时间,你需要知道它被调用了多少次以及每次调用所需的时间。其中一个没有另一个是没有用的。
即使它告诉你这两个信息,它也不会告诉你哪些语句在函数内部占用了时间。它们会告诉你很多东西,比如注释的调用图等等,但仍然是许多线索的形式,你必须去破解它们,让你的猜测听起来更“有根据”。
然后他们谈论“准确性”有多高。
这样做可以制作出漂亮的报告,但并不能解决问题。
他们可以做到(但他们没有),指向特定的语句或指令,并说:
就是这个精确的语句,如果你能摆脱它,将节省总执行时间的X%。
并按X排序。
如果你真的需要解决性能问题,那么你需要的就是这个,而且你可以很容易地自己得到它。看这里:
如何优化你的程序性能