掌桥专利:专业的专利平台
掌桥专利
首页

应用程序性能分析方法及装置、电子设备

文献发布时间:2023-06-19 09:29:07


应用程序性能分析方法及装置、电子设备

技术领域

本公开涉及软件技术领域,具体而言,涉及一种应用程序性能分析方法、应用程序性能分析装置、电子设备以及计算机可读存储介质。

背景技术

随着智能手机、平板电脑等终端设备的快速发展,终端设备上安装的应用程序越来越多,与此同时,用户对应用程序的性能表现要求也越来越高。以游戏应用程序为例,其一个主要的性能表现要求是应用程序在运行不能发生卡顿。

现有技术中,有部分技术的技术方案可以通过采集CPU快照等方式对应用程序的性能进行分析;但游戏应用程序卡顿中最主要的指标是帧,该方法并不适用于此类分帧运行的应用程序的性能分析。此外,部分技术方案还可能存在问题点定位不准等问题。

因此,提供一种新的应用程序性能分析方案是非常必要的。

需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。

发明内容

本公开的一个示例性实施例提供一种应用程序性能分析方法、应用程序性能分析装置、电子设备以及计算机可读存储介质,进而可以适用于分帧运行的应用程序的性能分析。

根据本公开的一个方面,提供一种应用程序性能分析方法,包括:

对应用程序的源代码进行结构分析,确定所述应用程序中各功能模块的入口位置以及出口位置;

在各所述功能模块的入口位置插入第一代码、在各所述功能模块的出口位置插入与所述第一代码对应的第二代码;

在所述应用程序运行时,将各所述功能模块中的第一代码记录的运行起始时间以及第二代码记录的运行结束时间存储于当前帧对应的存储单元;

根据每一帧对应的存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间,对所述应用程序进行性能分析。

在本公开的一种示例性实施例中,所述方法还包括:

为每一所述第一代码及其对应的第二代码分配唯一标识;

其中,所述第一代码记录的运行起始时间以及第二代码记录的运行结束时间信息中包含所述唯一标识。

在本公开的一种示例性实施例中,确定所述应用程序中各功能模块的入口位置以及出口位置,包括:

将所述功能模块的开头位置确定为所述入口位置。

在本公开的一种示例性实施例中,确定所述应用程序中各功能模块的入口位置以及出口位置,包括:

在所述功能模块包含跳出语句时,将所述跳出语句对应的跳出位置以及所述功能模块的结尾位置均确定为所述出口位置;

在所述功能模块不包含跳出语句时,将所述功能模块的结尾位置确定为所述出口位置。

在本公开的一种示例性实施例中,所述方法还包括:

将所述跳出语句包含的内容赋值给一唯一变量;

将所述跳出语句要返回的值设为所述唯一变量。

在本公开的一种示例性实施例中,其中,所述存储单元用于记录对应帧的帧起始时间、各所述功能模块的运行起始时间以及对应的所述唯一标识、各所述功能模块的运行结束时间以及对应的所述唯一标识。

在本公开的一种示例性实施例中,对所述应用程序进行性能分析,包括:

根据第N+1个所述存储单元中的帧起始时间与第N个所述存储单元中的帧起始时间之间的间隔,确定第N帧的运行时间。

在本公开的一种示例性实施例中,对所述应用程序进行性能分析,包括:

根据所述唯一标识确定相对应的运行起始时间和运行结束时间;

根据相对应的运行起始时间和运行结束时间之间的间隔,确定所述唯一标识对应的功能模块的运行时间。

在本公开的一种示例性实施例中,对所述应用程序进行性能分析,包括:

根据所述存储单元中各运行起始时间和各运行结束时间的分布,分析各所述功能模块的调用堆栈。

在本公开的一种示例性实施例中,所述方法还包括:

在第一终端设备上为所述应用程序中插入所述第一代码和第二代码之后,将所述应用程序传输至第二终端设备以在所述第二终端设备运行所述应用程序。

在本公开的一种示例性实施例中,所述方法还包括:

在所述应用程序执行完毕后,通过所述第一终端设备接收所述第二终端设备发送的各所述存储单元存储的数据。

在本公开的一种示例性实施例中,所述方法还包括:

对所述应用程序的性能分析结果进行可视化展示。

在本公开的一种示例性实施例中,所述应用程序为依赖于主应用程序运行的脚本程序。

根据本公开的一个方面,提供一种应用程序性能分析装置,包括:

源代码分析模块,用于对应用程序的源代码进行结构分析,确定所述应用程序中各功能模块的入口位置以及出口位置;

代码插入模块,用于在各所述功能模块的入口位置插入第一代码、在各所述功能模块的出口位置插入与所述第一代码对应的第二代码;

时间记录模块,用于在所述应用程序运行时,将各所述功能模块中的第一代码记录的运行起始时间以及第二代码记录的运行结束时间存储于当前帧对应的存储单元;

性能分析模块,用于根据每一帧对应的存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间,对所述应用程序进行性能分析。

在本公开的一种示例性实施例中,所述装置还包括:

唯一标识分配模块,用于为每一所述第一代码及其对应的第二代码分配唯一标识;其中,所述第一代码记录的运行起始时间以及第二代码记录的运行结束时间信息中包含所述唯一标识。

在本公开的一种示例性实施例中,所述源代码分析模块将所述功能模块的开头位置确定为所述入口位置。

在本公开的一种示例性实施例中,所述源代码分析模块通过如下步骤确定所述应用程序中各功能模块的出口位置:在所述功能模块包含跳出语句时,将所述跳出语句对应的跳出位置以及所述功能模块的结尾位置均确定为所述出口位置;在所述功能模块不包含跳出语句时,将所述功能模块的结尾位置确定为所述出口位置。

在本公开的一种示例性实施例中,所述源代码分析模块还用于,将所述跳出语句包含的内容赋值给一唯一变量;以及,将所述跳出语句要返回的值设为所述唯一变量。

在本公开的一种示例性实施例中,其中,所述存储单元用于记录对应帧的帧起始时间、各所述功能模块的运行起始时间以及对应的所述唯一标识、各所述功能模块的运行结束时间以及对应的所述唯一标识。

在本公开的一种示例性实施例中,所述性能分析模块用于,根据第N+1个所述存储单元中的帧起始时间与第N个所述存储单元中的帧起始时间之间的间隔,确定第N帧的运行时间。

在本公开的一种示例性实施例中,所述性能分析模块用于,根据所述唯一标识确定相对应的运行起始时间和运行结束时间;以及,根据相对应的运行起始时间和运行结束时间之间的间隔,确定所述唯一标识对应的功能模块的运行时间。

在本公开的一种示例性实施例中,对所述应用程序进行性能分析,所述性能分析模块用于,根据所述存储单元中各运行起始时间和各运行结束时间的分布,分析各所述功能模块的调用堆栈。

在本公开的一种示例性实施例中,所述源代码分析模块、所述代码插入模块以及所述性能分析模块在第一终端设备运行;所述时间记录模块在所述第二终端设备运行;其中,在第一终端设备上为所述应用程序中插入所述第一代码和第二代码之后,将所述应用程序传输至第二终端设备以在所述第二终端设备运行所述应用程序。

在本公开的一种示例性实施例中,所述装置还包括:

可视化模块,用于对所述应用程序的性能分析结果进行可视化展示。

在本公开的一种示例性实施例中,所述应用程序为依赖于主应用程序运行的脚本程序。

根据本公开的一个方面,提供一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述的方法。

根据本公开的一个方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述的方法。

在本公开的一示例实施方式所提供的应用程序性能分析方法中,首先确定应用程序中各功能模块的入口位置以及出口位置并在入口位置插入第一代码,在出口位置插入第二代码;在应用程序运行时,则可以通过第一代码以及第二代码记录功能模块的运行起始时间以及运行结束时间,并将记录的信息存储于当前帧对应的存储单元;进而可以基于存储单元存储的信息对应用程序的各帧分别进行分析,从而可以确定卡顿帧。相比于现有技术,该方法不但能够适用于分帧运行的应用程序的性能分析,而且能够定位卡顿帧以及问题点,从而为卡顿原因分析及卡顿问题解决提供了有效的参考依据。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了可以应用本公开实施例的一种应用程序性能分析方法及装置的示例性系统架构的示意图;

图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图;

图3示意性示出了根据本公开的一个实施例的应用程序性能分析方法的流程图;

图4示意性示出了根据本公开的一个实施例中确定出口位置过程的流程图;

图5示意性示出了根据本公开的一个实施例中在插入第一代码以及第二代码的示例图;

图6示意性示出了根据本公开的一个实施例中在插入第一代码以及第二代码的示例图;

图7示意性示出了根据本公开的一个实施例中对代码块中的错误进行处理的示例图;

图8示意性示出了根据本公开的一个实施例中在插入第一代码以及第二代码的示例图;

图9示意性示出了根据本公开的一个实施例中第一代码以及第二代码的示例图;

图10示出了可以应用本公开实施例的一种应用程序性能分析方法的应用场景示意图;

图11示意性示出了根据本公开的一个实施例中为应用程序中插入所述第一代码和第二代码的流程图;

图12示意性示出了根据本公开的一个实施例中的二维码示意图;

图13示意性示出了根据本公开的一个实施例中对性能分析结果进行可视化展示的示意图;

图14示意性示出了根据本公开的一个实施例的应用程序性能分析装置的框图。

具体实施方式

现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。

此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

图1示出了可以应用本公开实施例的一种应用程序性能分析方法及装置的示例性应用环境的系统架构的示意图。

如图1所示,系统架构100可以包括终端设备101、102、103中的一个或多个,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。终端设备101、102、103可以是具有显示屏的各种电子设备,包括但不限于台式计算机、便携式计算机、智能手机和平板电脑等等。应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。

本公开实施例所提供的应用程序性能分析方法可以由服务器105执行,相应地,应用程序性能分析装置可以设置于服务器105中。本公开实施例所提供的应用程序性能分析方法也可以由终端设备101、102、103执行,相应的,应用程序性能分析装置也可以设置于终端设备101、102、103中,本示例性实施例中对此不做特殊限定。此外,本公开实施例所提供的应用程序性能分析方法可以由终端设备101、102、103与服务器105共同执行,相应地,应用程序性能分析装置可以设置于终端设备101、102、103与服务器105中。举例而言,在一种示例性实施例中,可以是在服务器105为应用程序中插入打点代码后,将应用程序传输至终端设备101、102、103,以在所述终端设备101、102、103运行所述应用程序;终端设备101、102、103将应用程序运行过程中记录的时间信息发送给服务器105以便于性能分析。

图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。

需要说明的是,图2示出的电子设备的计算机系统200仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图2所示,计算机系统200包括中央处理单元(CPU)201,其可以根据存储在只读存储器(ROM)202中的程序或者从存储部分208加载到随机访问存储器(RAM)203中的程序而执行各种适当的动作和处理。在RAM 203中,还存储有系统操作所需的各种程序和数据。CPU201、ROM 202以及RAM 203通过总线204彼此相连。输入/输出(I/O)接口205也连接至总线204。

以下部件连接至I/O接口205:包括键盘、鼠标等的输入部分206;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分207;包括硬盘等的存储部分208;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分209。通信部分209经由诸如因特网的网络执行通信处理。驱动器210也根据需要连接至I/O接口205。可拆卸介质211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器210上,以便于从其上读出的计算机程序根据需要被安装入存储部分208。

特别地,根据本公开的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分209从网络上被下载和安装,和/或从可拆卸介质211被安装。在该计算机程序被中央处理单元(CPU)201执行时,执行本申请的方法和装置中限定的各种功能。在一些实施例中,计算机系统200还可以包括AI(ArtificialIntelligence,人工智能)处理器,该AI处理器用于处理有关机器学习的计算操作。

需要说明的是,本公开所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。

作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图3~图11所示的各个步骤等。

以下对本公开实施例的技术方案进行详细阐述:

本示例实施方式提供了一种应用程序性能分析方法。该应用程序性能分析方法可以应用于上述服务器105,也可以应用于上述终端设备101、102、103中的一个或多个,也可以同时应用于上述服务器105与上述终端设备101、102、103中的一个或多个;本示例性实施例中对此不做特殊限定。参考图3所示,该应用程序性能分析方法可以包括以下步骤S310至步骤S340:

步骤S310,对应用程序的源代码进行结构分析,确定所述应用程序中各功能模块的入口位置以及出口位置。

步骤S320,在各所述功能模块的入口位置插入第一代码、在各所述功能模块的出口位置插入与所述第一代码对应的第二代码。

步骤S330,在所述应用程序运行时,将各所述功能模块中的第一代码记录的运行起始时间以及第二代码记录的运行结束时间存储于当前帧对应的存储单元。

步骤S340,根据每一帧对应的存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间,对所述应用程序进行性能分析。

相比于现有技术,在本示例实施方式所提供的应用程序性能分析方法中,不但能够适用于分帧运行的应用程序的性能分析,而且能够定位卡顿帧以及问题点,从而为卡顿原因分析及卡顿问题解决提供了有效的参考依据。

下面,对于本示例实施方式的上述步骤进行更加详细的说明。

在步骤S310中,对应用程序的源代码进行结构分析,确定所述应用程序中各功能模块的入口位置以及出口位置。

本示例实施方式中,所述应用程序可以为依赖于主应用程序运行的脚本程序,例如依赖于微信应用程序运行的小程序,该小程序例如可以是游戏类应用、学习教育类应用、多媒体类应用等。当然,在本公开的其他示例性实施例中,所述应用程序也可以为页面应用程序或者其他类型的应用程序,本示例性实施例中对此不做特殊限定。

本示例实施方式中,可以通过解析器对应用程序的源代码进行抽象语法树结构分析或者解析树结构分析等,本示例性实施例中对此不做特殊限定。以抽象语法树结构分析为例,抽象语法树可以对源代码的抽象语法结构进行树状表示,树上的每个节点都表示源代码中的一种结构,同时,抽象语法树无需表示出真实语法出现的每一个细节,如嵌套括号被隐含在语法树的结构中,无需以节点的形式呈现。分析的方法可以是自顶向下分析,即根据形式语法规则,在语法分析树的自顶向下展开中搜索输入符号串可能的最左推导;单词按从左到右的顺序依次使用;也可以是自底向上分析,即语法分析器从现有的输入符号串开始,尝试将其根据给定的形式语法规则进行改写,最终改写为语法的起始符号;但本实施例中并不以此为限。

在对应用程序的源代码进行结构分析之后,可以基于语法树或者解析树等确定应用程序包括的各个功能模块。本示例实施方式中,需要在各个功能模块的入口位置以及出口位置插入预设的代码(即进行打点或埋点);因此,在上述分析基础上,还需要确定所述应用程序中各功能模块的入口位置以及出口位置。

举例而言,上述功能模块一般具有一个入口位置以及一个或多个出口位置。本示例实施方式中,可以将所述功能模块的开头位置确定为所述入口位置;以JavaScript语言为例,可以在功能模块的第一行插入预设的代码;当然,根据编程语言的不同,所述功能模块的开头位置也可能是其他行,本示例性实施例中对此不做特殊限定。由于功能模块可能存在多个出口位置,参考图4所示,本示例实施方式中可以通过步骤S410至步骤S430确定功能模块的出口位置。其中:

在步骤S410中,判断所述功能模块是否包含跳出语句。本示例实施方式中所述跳出语句的功能包括:如果正在运行的当前功能模型中包括该语句,当该语句被执行之后,将跳出当前功能模块,而不再执行当前功能模块其余未执行部分。以JavaScript语言为例,所述跳出语句可以为return()函数,也可以是throw()函数等。当然,根据编程语言的不同,所述跳出语句也可以为其他函数,这同样属于本公开的保护范围。

在步骤S420中,当判断所述功能模块不包含跳出语句时,将所述功能模块的结尾位置确定为所述出口位置。以JavaScript语言为例,可以在功能模块的最后一行插入预设的代码;参考图5所示,其中_start()函数即功能模块test1()的入口位置插入的预设的代码;_end()函数即功能模块test1()的出口位置插入的预设的代码。当然,根据编程语言的不同,所述功能模块的结尾位置也可能是其他行,本示例性实施例中对此不做特殊限定。

在步骤S430中,当判断所述功能模块包含跳出语句时,将所述跳出语句对应的跳出位置以及所述功能模块的结尾位置均确定为所述出口位置。此外,由于跳出语句包含的内容可能并非简单的变量,也有可能是一个较为复杂的表达式;因此,本示例实施方式中,将所述跳出语句包含的内容赋值给一唯一变量,接着将所述跳出语句要返回的值设为所述唯一变量。参考图6所示,以JavaScript语言为例,可以将跳出语句return(a=2,(function(){...}))中的内容(a=2,(function(){...}))赋值给唯一变量uid1,接着将return()函数要返回的值设为uid1。进行这样的转换之后,则可以更加方便和准确的确定跳出语句对应的跳出位置,即跳出语句返回变量的位置,如return()函数的前一行等。继续参考图6所示,其中_start()函数即功能模块test1()的入口位置插入的预设的代码;两个_end()函数即功能模块test1()的两个出口位置插入的预设的代码。当然,根据编程语言的不同,所述功能模块的出口位置也可以通过其他方式确定;上述唯一变量可以是上下文唯一变量,也可以是全局唯一变量;这些均同样属于本公开的保护范围。

在步骤S320中,在各所述功能模块的入口位置插入第一代码、在各所述功能模块的出口位置插入与所述第一代码对应的第二代码。

本示例实施方式中,第一代码的主要功能之一是获取功能模块的运行起始时间,第二代码的主要功能之一是获取功能模块的运行结束时间。由于应用程序中会包括多个功能模块;在应用程序运行时,为了区分当前被调用的是哪个功能模块,本示例实施方式中可以为每个功能模块分配一个唯一标识,即Key;该唯一标识可以通过自增函数生成,也可以通过其他方式(如根据预设规则随机生成等)生成,本示例性实施例中对此不做特殊限定。

在此基础上,可以在为各功能模块插入第一代码和第二代码时,为每一所述第一代码及其对应的第二代码分配该功能模块的唯一标识;进而,在所述第一代码记录的运行起始时间以及第二代码记录的运行结束时间信息中可以包含所述唯一标识,以便于判断对应的是哪个功能模块的运行时间信息以及便于后续分析应用程序的调用堆栈。

此外,对于符合开发者预期的异常,开发者一般会使用异常处理函数进行处理;以JavaScript语言为例,对于符合开发者预期的异常,可以使用Try to Catch方式处理,即通过try语句测试代码块中的错误,通过catch语句处理错误;然而,如图7所示,被Try toCatch的内容可能有着多层的调用堆栈:假设功能模块functionA的内容用Try to Catch包裹,如果运行到功能模块functionC时发生异常中断,那么第二代码_endC()和第二代码_endB()将因为异常中断不会被执行;但由于使用Try to Catch包裹了异常,因此第二代码_endA()将会继续执行,此时获取的时间信息数据将会是不完整的,而且由于第一代码_start()与第二代码_end()的不对等,将会导致后续性能分析时产生错误。

本示例实施方式中,通过为每一所述第一代码及其对应的第二代码分配其所在功能模块的唯一标识,则可以利用唯一标识确保第一代码与第二代码的匹配关系,进而可以确保获取的时间信息数据的准确性。以JavaScript语言为例,可以插入如图8所示的第一代码_start()和第二代码_end(),这样如果功能模块test1()被调用,且运行至第一代码_start()时,可以自动生成功能模块test1()的唯一标识uid2,然后将唯一标识uid2分配给第一代码_start()和第二代码_end(),保证第一代码与第二代码的一一对应关系。

在步骤S330中,在所述应用程序运行时,将各所述功能模块中的第一代码记录的运行起始时间以及第二代码记录的运行结束时间存储于当前帧对应的存储单元。

本示例实施方式中,当在各功能模块插入第一代码和第二代码之后,可以分帧执行应用程序;例如,可以通过RequestAnimationFrame()函数或者其他方法控制应用程序分帧执行。在应用程序运行过程中,在运行至第一代码时,第一代码可以获取当前时间戳,作为当前被调用的功能模块的运行起始时间信息;在运行至第二代码时,第二代码可以获取当前时间戳,作为当前被调用的功能模块的运行结束时间信息;同时,第一代码和第二代码可以将获取的时间信息数据存储于当前帧对应的存储单元;上述存储单元例如可以是预设格式的数组或者其他数据存储单元。

本示例实施方式中,由于插入的第一代码和第二代码会与应用程序代码一起运行,因此插入的代码优选避免复杂、耗时的计算,从而避免第一代码和第二代码的耗时影响应用程序代码的执行耗时。基于此,所述存储单元可以用于记录对应帧的帧起始时间、各所述功能模块的运行起始时间以及对应的所述唯一标识、各所述功能模块的运行结束时间以及对应的所述唯一标识,即仅记录关键数据即可。举例而言,本示例实施方式中,采用的数据的格式可以如下所示:

其中,最外层数组的每一项元素为每一帧对应的存储单元,该存储单元同样为数组形式。对于一个存储单元而言,其中time表示该存储单元对应的帧的帧起始时间;list是在该帧内应用程序调用的各功能模块中第一代码_start()和第二代码_end()返回的信息:key是为第一代码和第二代码分配的唯一标识,也即当前被调用的功能模块的唯一标识;type用于表示具体是第一代码还是第二代码返回的信息,例如,‘start’表示是第一代码返回的运行起始时间;time用于表示第一代码和第二代码获取的当前时间戳。

以JavaScript语言为例,可以通过如图9所示的第一代码_start()和第二代码_end()获取对应帧的帧起始时间、各所述功能模块的运行起始时间以及对应的所述唯一标识、各所述功能模块的运行结束时间以及对应的所述唯一标识,并按照上述存储单元的数据格式进行存储。由于本示例实施方式中仅仅是把当前调用时传入的唯一标识和当前的时间戳按帧存入到一个数组项中,因此代码逻辑简单且没有复杂的计算,代码运行的时间一般在微秒级别,因此基本上可以忽略对应用程序代码的影响。

在步骤S340中,根据每一帧对应的存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间,对所述应用程序进行性能分析。

在分析对应用程序进行性能分析,例如卡顿问题分析时,开发者通常关心的是哪一帧发生了卡顿、卡顿帧耗时是多少、卡顿帧中调用了哪些功能模块、调用的功能模块的耗时分别是多少等。本示例实施方式中,则可以基于存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间进行卡顿帧分析、功能模块的运行时间分析以及调用堆栈分析等。举例而言:

本示例实施方式中,可以根据第N+1个所述存储单元中的帧起始时间与第N个所述存储单元中的帧起始时间之间的间隔,确定第N帧的运行时间。例如,第100个存储单元中的帧起始时间为time1,第101个存储单元中的帧起始时间为time2,则可以确定第100帧的运行时间为time2与time1之差。在计算得到各帧的运行时间之后,则可以从中筛选出运行时间过长的帧,也即卡顿帧。例如,筛选出运行时间大于预设时长,如大于16毫秒,也即小于60FPS(Frame Per Second,每秒传输帧数)的帧,并将这些帧作为卡顿帧,以便于后续分析。

本示例实施方式中,还可以根据所述存储单元中各运行起始时间和各运行结束时间的分布,分析各所述功能模块的调用堆栈。例如,可以根据第N个上述存储单元中的list项,分析第N帧的功能模块的调用堆栈。具体而言,list项中记录的是应用程序代码运行时调用插入的第一代码或第二代码而返回的时间信息,且分布顺序与运行时第一代码或第二代码的被调用顺序一致,因此type为end的list项与type为start的list项一一成对,且可以表示一个功能模块的调用堆栈。进而,在分析调用堆栈时,如果遇到type为start的list项,说明执行的是push入栈操作;如果遇到type为end的list项,说明执行的是pop出栈操作。通过这种方式,即可分析出当前帧中调用了哪些功能模块以及各功能模块的调用堆栈。

本示例实施方式中,还可以根据相对应的运行起始时间和运行结束时间之间的间隔,确定所述唯一标识对应的功能模块的运行时间。在分析出功能模块的调用堆栈后,对于任意一个功能模块,其对应的type为start的list项中的time元素记录了该功能模块的运行起始时间,即该功能模块何时开始被调用;其对应的type为end的list项中的time元素记录了该功能模块的运行结束时间,即该功能模块何时调用结束;同时,这两个时刻之间的间隔时间,即该功能模块的运行时间。

基于上述方案,不但可以定位卡顿帧,而且可以分析卡顿帧中调用的功能模块以及功能模块的调用堆栈,同时,还可以对功能模块的运行时间进行分析;从而准确的定位是哪个功能模块导致了卡顿帧的出现;因此,相比于现有技术,本示例实施方式中的方案对于问题点定位更加准确。此外,在本公开的其他示例性实施例中,也可以基于上述数据进行更多方面的分析,本示例性实施例中对此不做特殊限定。

进一步的,为了使开发者更加直观的获取对于应用程序的性能分析结果,本示例实施方式中,还可以对所述应用程序的性能分析结果进行可视化展示。举例而言:

本示例实施方式中可以使用Chrome浏览器的Performance面板对性能分析结果进行展示。Performance面板展示数据时会读取一个json文件,通过该json文件中的BeginFrame指令和DrawFrame指令可以用来描述对于一帧的开始时间与结束时间的展示;因此,基于上述步骤S340中的性能分析结果数据以及该指令,则可以对于各帧的开始时间与结束时间进行展示。通过该json文件中的FunctionCall指令可以描述对于某一功能模块的调用;因此,基于上述步骤S340中的性能分析结果数据以及该指令,可以对各功能模块的运行起始时间和运行结束时间以及各功能模块的调用堆栈进行展示。当然,在本公开的其他示例性实施例中,也可以通过其他UI界面进行可视化展示,例如通过Web页面进行可视化等;本示例性实施例中对此不做特殊限定。

下面结合具体应用场景对本示例实施方式中的应用程序性能分析方法进行进一步的说明。

参考图10所示,本示例实施方式中的应用场景中可以包括第一终端设备以及第二终端设备;在第一终端设备上配置有开发者工具,例如可以为小程序开发者工具,并且在该开发者工具中集成有本示例实施方式中的应用程序性能分析方法对应的软件模块。开发者向第一终端设备下达应用程序性能分析指令之后,第一终端设备可以通过开发者工具为所述应用程序中插入所述第一代码和第二代码。

举例而言,参考图11所示,为所述应用程序中插入所述第一代码和第二代码可以包括步骤S1101至步骤S1110。在步骤S1101中,开发者工具首先获取应用程序源代码;在步骤S1102中,对应用程序源代码进行结构分析,例如可以进行抽象语法树分析等;在步骤S1103中,根据结构分析结果,遍历应用程序中包括的各个功能模块;在步骤S1104中,在各个功能模块的入口位置,如开头位置插入上述第一代码;在步骤S1105中,判断功能模块是否包含如Return()函数或者Throw()函数等跳出语句;在步骤S1106中,如果判断不包含跳出语句,则确定功能模块仅有一个出口位置,即结尾位置,因此在结尾位置插入上述第二代码;在步骤S1107中,如果判断包含跳出语句,则生成唯一变量,如全局唯一变量或者上下文唯一变量等;在步骤S1108中,将跳出语句包含的内容赋值给该唯一变量,并且将跳出语句要返回的值设为该唯一变量,同时删除原来的跳出语句;在步骤S1109中,将跳出语句对应的跳出位置同样确定为出口位置,因此在跳出位置插入上述第二代码;在步骤S1110中,将插入上述第一代码和第二代码之后的应用程序作为转换后的应用程序源代码。

继续参考图10所示,在对应用程序的源代码进行转换之后,则可以将所述应用程序传输至第二终端设备以在所述第二终端设备运行所述应用程序。参考图12所示,本示例实施方式中,在对应用程序的源代码进行转换之后,可以生成一个二维码或者其他标识,开发者通过第二终端设备(如手机等)扫描该二维码或者标识之后,第一终端设备会将转换后的应用程序源代码传输给第二终端设备;第二终端设备的主应用程序则会驱动JavaScript代码渲染每一帧,并且在每一帧中通过插入的第一代码和第二代码采集各个功能模块的运行起始时间以及运行结束时间数据。

继续参考图10所示,在应用程序运行完毕之后,第二终端设备可以将采集的数据,即各上述存储单元存储的数据传输给第一终端设备,第一终端设备接收各存储单元存储的数据之后,则可以依据这些数据对应用程序进行性能分析,并对性能分析结果进行可视化展示;参考图13所示,为一个示例性的可视化展示结果。

此外,发明人对本示例实施方式中的应用程序性能分析方法进行了效果验证。例如,某小程序游戏的初始平均帧率仅在30FPS左右,游戏画面明显卡顿。开发者基于现有技术只能定位到性能问题可能是发生在JS层,但无法定位到具体的问题点。基于本示例实施方式中的方法,开发者可以很容易的定位卡顿的帧并确定问题点是在某个耗时较长的JSAPI(应用程序接口);进而可以基于该分析结果对应用程序进行优化,使得该小程序游戏后续的平均帧率稳定在55FPS以上;可见,相比于现有技术,本示例实施方式中的方法可以适用于分帧运行的应用程序的性能分析,而且问题点定位更加准确。

应当注意,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。

进一步的,本示例实施方式中,还提供了一种应用程序性能分析装置。参考图14所示,该应用程序性能分析装置1400可以包括源代码分析模块1410、代码插入模块1420、时间记录模块1430以及性能分析模块1440。其中:

源代码分析模块1410可以用于对应用程序的源代码进行结构分析,确定所述应用程序中各功能模块的入口位置以及出口位置;

代码插入模块1420可以用于在各所述功能模块的入口位置插入第一代码、在各所述功能模块的出口位置插入与所述第一代码对应的第二代码;

时间记录模块1430可以用于在所述应用程序运行时,将各所述功能模块中的第一代码记录的运行起始时间以及第二代码记录的运行结束时间存储于当前帧对应的存储单元;

性能分析模块1440可以用于根据每一帧对应的存储单元中存储的各所述功能模块的运行起始时间以及运行结束时间,对所述应用程序进行性能分析。

本示例性实施例中,所述装置还包括:

唯一标识分配模块可以用于为每一所述第一代码及其对应的第二代码分配唯一标识;其中,所述第一代码记录的运行起始时间以及第二代码记录的运行结束时间信息中包含所述唯一标识。

本示例性实施例中,所述源代码分析模块1410将所述功能模块的开头位置确定为所述入口位置。

本示例性实施例中,所述源代码分析模块1410通过如下步骤确定所述应用程序中各功能模块的出口位置:在所述功能模块包含跳出语句时,将所述跳出语句对应的跳出位置以及所述功能模块的结尾位置均确定为所述出口位置;在所述功能模块不包含跳出语句时,将所述功能模块的结尾位置确定为所述出口位置。

本示例性实施例中,所述源代码分析模块1410还用于,将所述跳出语句包含的内容赋值给一唯一变量;以及,将所述跳出语句要返回的值设为所述唯一变量。

本示例性实施例中,其中,所述存储单元用于记录对应帧的帧起始时间、各所述功能模块的运行起始时间以及对应的所述唯一标识、各所述功能模块的运行结束时间以及对应的所述唯一标识。

本示例性实施例中,所述性能分析模块1440用于,根据第N+1个所述存储单元中的帧起始时间与第N个所述存储单元中的帧起始时间之间的间隔,确定第N帧的运行时间。

本示例性实施例中,所述性能分析模块1440用于,根据所述唯一标识确定相对应的运行起始时间和运行结束时间;以及,根据相对应的运行起始时间和运行结束时间之间的间隔,确定所述唯一标识对应的功能模块的运行时间。

本示例性实施例中,对所述应用程序进行性能分析,所述性能分析模块1440用于,根据所述存储单元中各运行起始时间和各运行结束时间的分布,分析各所述功能模块的调用堆栈。

本示例性实施例中,所述源代码分析模块1410、所述代码插入模块1420以及所述性能分析模块1440在第一终端设备运行;所述时间记录模块1430在所述第二终端设备运行;其中,在第一终端设备上为所述应用程序中插入所述第一代码和第二代码之后,将所述应用程序传输至第二终端设备以在所述第二终端设备运行所述应用程序。

本示例性实施例中,所述装置还包括:

可视化模块可以用于对所述应用程序的性能分析结果进行可视化展示。

本示例性实施例中,所述应用程序为依赖于主应用程序运行的脚本程序。

上述应用程序性能分析装置中各模块或单元的具体细节已经在对应的应用程序性能分析方法中进行了详细的描述,因此此处不再赘述。

应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。

应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

相关技术
  • 应用程序性能分析方法及装置、电子设备
  • 应用程序性能数据处理方法、装置、电子设备及存储介质
技术分类

06120112182133