Skip to content

使用 fb 内置性能分析器进行性能分析


性能分析可用于分析应用程序的性能。

自 fbc 1.20.0 起,FreeBASIC 可以使用 fb 内置性能分析器来分析应用程序的执行情况。性能分析信息在程序运行时收集。

该性能分析功能为初学者和有经验的用户提供了一个易于使用的工具,帮助他们分析程序。

通过 fb 实现的该性能分析器的部分功能:

  • 易于使用,

  • 无需额外工具,

  • 可以分析(profiling)对外部库的调用。

该性能分析功能为初学者和有经验的用户提供了一个易于使用的工具,帮助他们分析程序。

性能分析程序的三个基本步骤:

  • 通过向 FreeBASIC 编译器传递适当的 -profgen ... 选项,或使用适当的 '-profgen ...' #Cmdline 选项编译源代码,为程序做好性能分析准备。

  • 运行程序,构建默认存储在 <filename[.exe]>.prf(其中 <filename[.exe]> 是可执行文件的名称)中的性能分析报告。

  • 直接分析性能分析报告(文本文件)。

fb 的性能分析器提供两种类型的分析:

  1. 函数调用分析

  2. 周期计数分析(目前仅在 -gen gas64 上处于开发中)

1. 函数调用分析(使用 fb 性能分析器)

应用程序的性能可以通过函数被调用的次数、执行这些函数所花费的时间以及哪些函数在调用其他函数来衡量。

这有助于识别可能执行时间过长或执行次数过多的函数,并考虑对其进行优化。

该功能是对 Angelo Mottola(lillo)2008 年分析器的重新实现,修复了一些问题,并添加了新功能。这次最新的研究起因于想对 fbc 编译器本身进行某种性能分析,但在 Windows 上使用 gprof 完全不成功。多年前,lillo 的函数调用分析器被移除,改用 gmon/gprof。

该工具不适合高分辨率时序分析。但它有助于识别程序中的潜在问题区域,或提供更好地了解被调用过程的起点。

FreeBASIC 支持函数分析;不支持基本块或逐行分析。

1.1 为性能分析准备程序(使用函数调用 fb 分析器)

只有使用 -profgen fb 命令行选项编译的代码才能进行此类分析。

向 FreeBASIC 编译器传递 -profgen fb 选项以准备程序进行性能分析,或使用 '-profgen fb' #Cmdline 选项编译源代码:

fbc program.bas -profgen fb
' or
#cmdline "-profgen fb"

这将告诉编译器在应用程序开始处以及每个函数开始处插入特殊的启动代码。

1.2 使用(函数调用 fb 分析器)分析程序

分析程序执行所需的信息在程序运行时收集。

运行程序开始收集函数调用信息。

性能分析报告自动存储在默认名为 <filename[.exe]>.prf 的文件中,位于程序所在目录。

1.3 分析性能分析报告(来自函数调用 fb 分析器)

编译并运行程序后,用户可以打开默认名为 <filename[.exe]>.prf 的性能分析报告(文本文件)。

报告分为两部分:

  • 每个函数的结果 - 各个过程及其调用过程的分析

  • 全局结果 - 所有过程相对于整个程序运行时间的分析

Function:被分析的父函数/子函数。父函数在左边,子函数缩进显示

Count:过程被调用的次数

Time:执行过程的秒数

Total%:执行时间相对于整个运行时间的百分比

Proc%:执行时间相对于过程运行时间的百分比

时间基于 fb 内置的 TIMER 函数。

在多线程情况下,每个线程有一个单独的性能分析器实例,将其数据存储在线程本地存储中。

最终的性能分析报告将每个线程(包括首先是主线程)的基本分析报告依次组合在一起。没有线程间的分组。

  • 简单示例:

    1.4 高级分析功能(使用函数调用 fb 分析器)

以下功能允许用户控制分析器收集的信息以及修改性能分析报告,与默认操作相比。

1.4.1 ./inc/fbc-int/profile.bi 包含文件中的高级过程

./inc/fbc-int/profile.bi 包含文件允许用户访问一些高级过程(在命名空间 FBC 内声明),用于使用 fb 的性能分析器。

这些过程将 fb 的分析器作为 API 公开,可以直接调用,并用于根据用户进行的任何调用记录结构生成分析报告:

  • 在运行时设置输出报告文件名:

function ProfileSetFileName ( byval filename as const zstring ptr ) as long

  • 设置/获取分析器选项:

function ProfileSetOptions ( byval options as PROFILE_OPTIONS ) as PROFILE_OPTIONS

function ProfileGetOptions ( ) as PROFILE_OPTIONS

两者都与 PROFILE_OPTIONS 枚举结构相关联(参见 ./inc/fbc-int/profile.bi 包含文件)

  • 在分析时忽略某个过程:

sub ProfileIgnore ( byval procedurename as zstring ptr )

  • 直接调用 fb 的分析器以执行自定义分析和报告:

过程示例:

sub ProfileInit () '' Initialize the profiler

function ProfileEnd ( byval errorcode as long ) as long '' Generate the profiling report and terminate the profiler

function ProfileBeginCall ( byval procedurename as const zstring ptr ) as any ptr '' Begin a call and return a caller_id pointer

sub ProfileEndCall ( byval procctx as any ptr ) '' End a call

  • 在运行时设置性能分析报告文件名的示例:

  • 告诉分析器生成调用树而不是时序和计数的示例:

  • 直接调用 fb 的分析器以执行自定义分析和报告的示例:

    1.4.2 条件生成分析代码

用户还可以控制分析代码的条件生成:

#pragma profile 控制分析代码的生成。

这允许可选地包含或排除要分析的源代码段。

用户可以使用 #pragma profile = false#pragma push( profile , false ) 可选地禁用分析代码生成

可以分别使用 #pragma profile = true#pragma pop( profile ) 重新激活分析代码生成

内置定义 __FB_OPTION_PROFILE__ 可指示是否正在生成分析代码:

生成分析代码时,__FB_OPTION_PROFILE__ 设置为非零值

不生成分析代码时,__FB_OPTION_PROFILE__ 设置为零

  • 纯学术示例:

2. 周期计数分析(使用 fb 性能分析器)

目前仅在 -gen gas64 上处于开发中。

周期计数 fb 性能分析器支持在某些目标上进行 CPU 周期计数分析。

它使用与函数调用 fb 分析器完全不同的方法。它将数据存储在特殊命名的数据段中,因此只能与支持任意命名段的链接器配合使用。

运行使用此命令编译的可执行文件后,它可以生成周期计数的基本报告。

对于每个被调用的用户过程体,有两种不同的计数:

  • 分析器对所有内部代码块(分隔来自任何其他用户过程或内置过程的可能调用)的 CPU 周期计数求和(因此所有其他被调用过程都从第一次计数中排除)。

  • 分析器还计算执行整个用户过程体时的 CPU 周期总数。

    2.1 为性能分析准备程序(使用周期计数 fb 分析器)

只有使用 -profgen cycles 命令行选项编译的代码才能进行此类分析。

向 FreeBASIC 编译器传递 -profgen cycles 选项以准备程序进行性能分析,或使用 '-profgen cycles' #Cmdline 选项编译源代码:

fbc program.bas -profgen cycles
' or
#cmdline "-profgen cycles"

2.2 使用(周期计数 fb 分析器)分析程序

分析程序执行所需的信息在程序运行时收集。

运行程序开始收集函数调用信息。

性能分析报告自动存储在默认名为 <filename[.exe]>.prf 的文件中,位于程序所在目录。

2.3 分析性能分析报告(来自周期计数 fb 分析器)

编译并运行程序后,用户可以打开默认名为 <filename[.exe]>.prf 的性能分析报告(文本文件)。

各模块的单个过程分析:

total:过程结束与开始之间的周期数

inside:真正在过程内部"花费"的周期数(不考虑过程体内的过程调用)

call count:过程被调用的次数

  • 简单示例:

返回 程序员指南

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系