代码分析器如何工作?

tun*_*nuz 22 profiler

当我在大学项目上工作时,我使用了一个由老年学生制作的项目内部剖析器,它非常基础但很好,因为它的任务是减去代码的两点之间的时间并给出统计数据.

现在,专业的探查器如何工作?是否预先处理代码以插入检查点或类似的东西?它是否使用调试数据读取二进制代码以捕获调用函数的位置?

谢谢.

Dic*_*eed 25

有许多不同的分析器以不同的方式工作.

常用的分析器只是定期检查正在运行的程序,以查看当前正在执行的汇编指令(程序计数器)以及调用当前函数(调用堆栈)的例程.这种采样分析器可以使用标准二进制文件,但如果您有调试符号来计算程序中给定地址的代码行,则更有用.

除了定期采样之外,您还可以使用处理器性能计数器在一定数量的事件(如高速缓存未命中)之后进行采样,这将帮助您查看程序的哪些部分因内存访问而变慢.

其他分析器涉及重新编译程序以插入指令(称为检测)来计算每个连续指令集(基本块)的执行频率,或者甚至可以记录执行基本块的顺序,或者记录变量的内容.某些地方.

检测方法可以为您提供所需的所有精度和数据,但会降低程序的速度,从而改变其性能特征.相比之下,使用基于采样的方法,您可以根据所获得的配置文件数据的准确性,针对运行程序所需的时间长度来调整性能影响.


Jon*_*eet 14

有两种常见的分析策略(无论如何都适用于基于VM的语言):仪器和采样.

每次方法启动和完成时,Instrumentation都会插入检查点并通知探查器.这可以通过JIT /解释器或后正常编译但是执行前阶段来完成,该阶段只是更改可执行文件.这会对性能产生非常显着的影响(从而扭曲任何时序结果).尽管如此,这对获得准确的计数很有帮助.

采样定期向VM询问所有线程的堆栈跟踪是什么样的,并以这种方式更新其统计信息.这通常会降低性能,但会产生较少的准确呼叫计数.