一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

程序耗时数据的处理方法、设备和存储介质与流程

2022-03-19 12:42:27 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,特别是涉及一种程序耗时数据的处理方法、设备及存储介质。


背景技术:

2.为了优化运行在电子设备上的应用程序的性能,需要对应用程序运行期间调用的代码段的执行耗时进行跟踪,以便于开发者定位到应用程序运行期间的耗时点,从而针对耗时点进行优化。
3.应用程序的耗时跟踪工具需要在应用程序运行阶段采集目标代码段的耗时数据,例如开始执行时间、执行完毕时间等。应用程序包括数量庞大的代码段,对这些代码段进行耗时数据的采集本身就会占用处理资源。因此,目前应用程序耗时跟踪方式往往存在性能损耗大、耗时跟踪不准确的问题。


技术实现要素:

4.为解决上述现有技术存在耗时跟踪工具自身性能损耗大,导致耗时跟踪不准确的问题,本技术实施例提出一种程序耗时数据的处理方法、设备和存储介质。
5.第一方面,本技术实施例提供一种程序耗时数据的处理方法,该方法包括:
6.在程序的目标代码段开始执行时,使用目标代码段起始位置处的第一插桩方法获取目标代码段的第一耗时数据,第一耗时数据包括开始执行时间,目标代码段包括调用层级不超过调用层级阈值的代码段;
7.在目标代码段执行结束时,使用目标代码段结束位置处的第二插桩方法获取目标代码段的第二耗时数据,第二耗时数据包括执行完毕时间,目标代码段的第一耗时数据和第二耗时数据用于确定目标代码段的执行耗时。
8.程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
9.可选的,使用所述目标代码段起始位置处的第一插桩方法获取所述目标代码段的第一耗时数据之前,所述方法还包括:
10.将所述程序的当前代码段对应的栈深度与所述调用层级阈值进行比较,若所述栈深度不大于所述调用层级阈值,所述当前代码段为所述目标代码段。
11.可选的,第一耗时数据和/或第二耗时数据中还包括目标代码段的标识,目标代码段所在线程的标识。相应的,根据目标代码段的标识,在预定的代码段标识与名称映射字典中查找目标代码段的名称;按照指定可视化工具可识别的数据格式,将目标代码段的标识、目标代码段的名称、目标代码段所在线程的标识、开始执行时间和执行完毕时间保存到目
标文件,目标文件的文件格式为指定可视化工具可识别的文件格式;将目标文件发送给可视化工具,以便可视化工具利用目标文件确定目标代码段的耗时,并将目标代码段的耗时转换为可视化数据。
12.为了便于开发人员发现耗时点,可以可视化的形式呈现目标代码段的耗时。本技术实施例提供的方法得到并发送目标文件,以复用现有的可视化工具。
13.在上述任意方法实施例的基础上,上述方法还可以包括如下操作:获取目标代码段的开始执行时间与执行完毕时间之间的时间差;将该时间差与第一时间差阈值进行比较;若该时间差大于第一时间差阈值,保留目标代码段的第一耗时数据和第二耗时数据。
14.本技术实施例提供的方法过滤掉耗时较短的目标代码段的耗时数据,从而达到压缩耗时数据的数据量的目的,可以进一步降低性能损耗。
15.在此基础上,上述目标代码段包括程序的指定工作域内的代码段,指定工作域是根据程序的历史目标代码段确定的,历史目标代码段为第一耗时数据和第二耗时数据被保留的历史代码段。
16.本技术实施例提供的方法,根据历史目标代码段确定本次耗时数据采集的工作域,一方面可以压缩程序代码,另一方面也可以避免不必要的耗时数据采集,降低性能损耗。
17.在上述任意方法实施例的基础上,目标代码段可以包括程序的主线程中的代码段和程序的辅助线程中的代码段。
18.程序的部分代码段(例如与显示界面相关的代码段)运行在主线程,部分代码段运行在辅助线程。在辅助线程中运行的某个代码段执行期间若占用某个内存区域,则该内存区域的读写锁与该代码段绑定,在这期间,若主线程中运行的某个代码段也需要占用该内存区域,则需要等待上述代码段释放该内存区域的读写锁。代码段目前的耗时跟踪工具仅对程序的主线程中的代码段进行耗时跟踪,对于上述情况,主线程上运行的上述代码段的执行耗时较长,会被误认为该代码段为耗时较长的代码段,而实际情况并非如此。本技术实施例提供的方法不仅对主线程的代码段采集耗时数据,还对辅助线程的代码段采集耗时数据,对于上述情况,主线程和辅助线程的代码段的执行耗时均提供给开发人员,开发人员据此能够发现真正的耗时点,进而制定正确的耗时优化方案。
19.在上述任意方法实施例的基础上,在目标代码段异常终止的情况下,还可以通过目标代码段的上级代码段调用结束指令结束目标代码段,上级代码段为调用目标代码段的代码段。
20.若目标代码段异常终止,则第二插装方法无法获取到执行完毕时间,导致该目标代码段的耗时数据采集异常。采用本技术实施例提供的方法,在目标代码段异常终止的情况下,可以通过其上级代码段调用结束指令结束目标代码段,从而保证第二插装方法获取到执行完毕时间。
21.第二方面,本技术实施例提供一种电子设备,包括:
22.第一耗时数据采集模块,用于在程序的目标代码段开始执行时,使用所述目标代码段起始位置处的第一插桩方法获取所述目标代码段的第一耗时数据,所述第一耗时数据包括开始执行时间,所述目标代码段包括调用层级不超过调用层级阈值的代码段;
23.第二耗时数据采集模块,用于在所述目标代码段执行结束时,使用所述目标代码
段结束位置处的第二插桩方法获取所述目标代码段的第二耗时数据,所述第二耗时数据包括执行完毕时间,所述目标代码段的第一耗时数据和第二耗时数据用于确定所述目标代码段的执行耗时。
24.程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
25.可选的,所述电子设备还包括层级控制模块,用于将所述程序的当前代码段对应的栈深度与所述调用层级阈值进行比较,若所述栈深度不大于所述调用层级阈值,所述当前代码段为所述目标代码段。
26.可选的,所述第一耗时数据和所述第二耗时数据中还包括所述目标代码段的标识,所述目标代码段所在线程的标识,所述电子设备还包括目标文件处理模块,用于:根据所述目标代码段的标识,在预定的代码段标识与名称映射字典中查找所述目标代码段的名称;按照指定可视化工具可识别的数据格式,将所述目标代码段的标识、所述目标代码段的名称、所述目标代码段所在线程的标识、所述开始执行时间和所述执行完毕时间保存到目标文件,所述目标文件的文件格式为所述指定可视化工具可识别的文件格式;将所述目标文件发送给所述可视化工具,以便所述可视化工具利用所述目标文件确定所述目标代码段的耗时,并将所述目标代码段的耗时转换为可视化数据。
27.为了便于开发人员发现耗时点,可以可视化的形式呈现目标代码段的耗时。本技术实施例提供的电子设备得到并发送目标文件,以复用现有的可视化工具。
28.在上述任意电子设备实施例的基础上,上述电子设备还可以包括数据过滤模块,用于获取目标代码段的开始执行时间与执行完毕时间之间的时间差;将该时间差与第一时间差阈值进行比较;若该时间差大于第一时间差阈值,保留目标代码段的第一耗时数据和第二耗时数据。
29.本技术实施例提供的电子设备过滤掉耗时较短的目标代码段的耗时数据,从而达到压缩耗时数据的数据量的目的,可以进一步降低性能损耗。
30.在此基础上,上述目标代码段包括程序的指定工作域内的代码段,指定工作域是根据程序的历史目标代码段确定的,历史目标代码段为第一耗时数据和第二耗时数据被保留的历史代码段。
31.本技术实施例提供的电子设备,根据历史目标代码段确定本次耗时数据采集的工作域,一方面可以压缩程序代码,另一方面也可以避免不必要的耗时数据采集,降低性能损耗。
32.在上述任意电子设备实施例的基础上,目标代码段可以包括程序的主线程中的代码段和程序的辅助线程中的代码段。
33.程序的部分代码段(例如与显示界面相关的代码段)运行在主线程,部分代码段运行在辅助线程。在辅助线程中运行的某个代码段执行期间若占用某个内存区域,则该内存区域的读写锁与该代码段绑定,在这期间,若主线程中运行的某个代码段也需要占用该内存区域,则需要等待上述代码段释放该内存区域的读写锁。代码段目前的耗时跟踪工具仅
对程序的主线程中的代码段进行耗时跟踪,对于上述情况,主线程上运行的上述代码段的执行耗时较长,会被误认为该代码段为耗时较长的代码段,而实际情况并非如此。本技术实施例提供的电子设备不仅对主线程的代码段采集耗时数据,还对辅助线程的代码段采集耗时数据,对于上述情况,主线程和辅助线程的代码段的执行耗时均提供给开发人员,开发人员据此能够发现真正的耗时点,进而制定正确的耗时优化方案。
34.在上述任意电子设备实施例的基础上,该电子设备还可以包括异常处理模块,用于在目标代码段异常终止的情况下,通过目标代码段的上级代码段调用结束指令结束目标代码段,上级代码段为调用目标代码段的代码段。
35.若目标代码段异常终止,则第二插装方法无法获取到执行完毕时间,导致该目标代码段的耗时数据采集异常。采用本技术实施例提供的电子设备,在目标代码段异常终止的情况下,可以通过其上级代码段调用结束指令结束目标代码段,从而保证第二插装方法获取到执行完毕时间。
36.第三方面,本发明实施例提供一种电子设备,包括处理器和存储器;
37.存储器用于存储执行上述任意方法实施例的程序;
38.处理器被配置为执行存储器中存储的程序。
39.程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
40.第四方面,本发明实施例提供一种计算机可读存储介质,存储有实现上述任意方法实施例的程序。
41.程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的计算机可读存储介质中存储的程序仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
附图说明
42.图1为本技术实施例提供的程序耗时数据的处理方法流程图;
43.图2为本技术另一个实施例提供的程序耗时数据的处理方法流程图;
44.图3为本技术一个实施例提供的程序耗时可视化界面示意图;
45.图4为本技术一个实施例提供的电子设备的框图;
46.图5为本技术一个实施例提供的移动终端的结构示意图;
47.图6为本技术一个实施例提供的计算机设备的结构示意图。
具体实施方式
48.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不
用于限定本技术。
49.在本技术的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
50.本技术实施例提供一种耗时跟踪工具,该耗时跟踪工具采用插桩的方法采集程序耗时数据,那么,在程序编译期间,对程序的字节码进行插桩处理。具体的,本技术实施例提供的耗时跟踪工具调用指定接口获取程序编译产生的字节码,通过asm库(基于java字节码层面的代码分析和修改工具,官方网址为https://asm.ow2.io/)实现对字节码的如下编辑修改:在指定作用域内的类方法(目标代码段)的起始位置插入第一插桩方法,该第一插桩方法用于采集类方法的开始执行时间,在指定作用域的类方法的结束位置插入第二插桩方法,该第二插桩方法用于采集类方法的执行完毕时间;写入运行时配置参数到指定运行时配置类;自动注入依赖库初始化相关类。
51.另外,在应用程序运行时,通过记录方法调用栈深度的方式,限制数据采集过程在指定的方法调用深度(又称调用层级)之内,从而控制数据采集的性能损耗。具体的,将应用程序的当前代码段对应的栈深度与调用层级阈值进行比较,若该栈深度不大于调用层级阈值,当前代码段为目标代码段。其中,当前代码段是指当前需要执行的代码段,其对应的栈深度是指其执行所需参数在栈中的深度。
52.除了采用上述记录方法调用栈深度的方式来限制方法调用深度,也可以通过限制插桩的方式来限制方法调用深度。应当指出的是,通过限制插桩的方式来限制方法调用深度,其对方法调用深度的控制精度虽然无法与记录方法调用栈深度的方式相比,但也能够在一定程度上达到控制方法调用深度的目的,从而在一定程度上控制数据采集的性能损失。
53.相应的,上述处理过程中可以为指定作用域内的所有类方法进行插桩。若需要通过插桩控制方法调用深度,也可以为指定作用域内调用层级不超过调用层级阈值的类方法进行插桩。
54.上述指定作用域和调用层级阈值可以在配置文件中配置,该配置文件与程序的字节码一并打包。该配置文件中还可以包括耗时数据采集模式,以便耗时跟踪工具使用配置文件中指定的耗时数据采集模式进行耗时数据的采集。
55.其中,代码段的调用层级反映了嵌套调用的级数。假设类方法a在执行过程中调用类方法b,类方法b在执行过程中调用类方法c,类方法c在执行过程中调用类方法d。其中,类方法a的调用层级为1,类方法b的调用层级为2,类方法c的调用层级为3,类方法d的调用层级为4。
56.本技术实施例采用插桩的方法采集程序耗时数据,使得程序耗时数据采集的使用场景更为广泛,既可以在移动终端上采集程序耗时数据,也可以在计算机上采集程序耗时工具;既可以在线下(例如程序测试阶段),由程序开发人员通过电子设备(如移动终端、计算机)上安装的开启耗时采集功能的安装包采集程序耗时数据,也可以在程序上线后,由用户(或者耗时跟踪工具自动)通过移动终端上安装的开启耗时采集功能的安装包采集程序耗时数据。
57.基于上述插桩处理,本技术实施例提供一种程序耗时数据的处理方法,如图1所
示,该方法包括:
58.步骤101、在程序的目标代码段开始执行时,使用目标代码段起始位置处的第一插桩方法获取目标代码段的第一耗时数据,第一耗时数据包括开始执行时间,目标代码段包括调用层级不超过调用层级阈值的代码段。
59.本技术实施例中,目标代码段是需要进行耗时跟踪的代码段,目标代码段位于上述指定作用域内。
60.本技术实施例中,基于上述插桩过程,目标代码段是指类方法。应当指出的是,在实际应用中,目标代码段也可以是指函数。
61.步骤102、在目标代码段执行结束时,使用目标代码段结束位置处的第二插桩方法获取目标代码段的第二耗时数据,第二耗时数据包括执行完毕时间,目标代码段的第一耗时数据和第二耗时数据用于确定目标代码段的执行耗时。
62.程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
63.如上所述,程序中打包有配置文件,上述处理过程可以按照配置文件中指示的程序耗时数据采集模式进行程序耗时数据(第一耗时数据和第二耗时数据)的采集。
64.本技术实施例不对程序耗时数据采集模式进行限定。
65.程序耗时采集模式可以为systrace模式(一种现有的耗时跟踪模式),即采用现有的systrace工具实现程序耗时数据的采集,那么,开发人员将安装有该程序的电子设备(例如移动终端)与安装有systrace工具的电脑连接,在电子设备上运行应用程序,该应用程序自动调用trace.beginsection()/trace.end()方法对,采集各个目标代码段的第一耗时数据和第二耗时数据,并将获取到的第一耗时数据和第二耗时数据上传给电脑中的systrace工具,由systrace工具利用第一耗时数据和第二耗时数据进行程序耗时分析。
66.其中,trace.beginsection()为第一插桩方法,trace.end()为第二插桩方法。
67.程序耗时采集模式还可以是自定义模式,对于采用自定义模式采集到的程序耗时数据,可以进行可视化处理,以便于开发人员发现耗时点。
68.实际应用中,可以开发可视化工具对上述程序耗时数据进行可视化处理,为了降低开发成本,也可以复用现有的可视化工具对自定义模式采集到的数据进行可视化处理。例如,复用systrace工具的可视化功能对程序耗时数据进行可视化处理。
69.申请人通过分析systrace工具可视化处理过程发现,systrace工具可以识别文件格式为“.trace”的文件中的数据,对其中的数据进行可视化处理,得到可视化数据,并将可视化数据保存到文件格式为“.html”的文件中。
70.其中,“.trace”格式的文件中和函数耗时相关的数据核心结构可以简化为如下结构:
71.《线程名》《线程标识》[001]...1《时间戳》:tracing_mark_write:《b或者e》|《进程标识》《目标代码段标识》
[0072]
其中,《》内是与函数耗时相关、需要采集的数据,[001]...1表示该数据结构中所
需要的、但与耗时跟踪无关的数据。
[0073]
其中,时间戳记载了开始执行时间或执行完毕时间。若时间戳表示开始执行时间,则可以“b”标识,若时间戳表示执行完毕时间,则可以“e”标识。
[0074]
为了复用systrace工具的可视化功能,需要将上述自定义模式采集到的程序耗时数据以上述数据格式保存到“.trace”格式的文件中。
[0075]
那么,上述第一耗时数据和/或第二耗时数据中还包括目标代码段的标识,目标代码段所在线程的标识。相应的,根据目标代码段的标识,在预定的代码段标识与名称映射字典中查找目标代码段的名称;按照指定可视化工具可识别的数据格式,将目标代码段的标识、目标代码段的名称、目标代码段所在线程的标识、开始执行时间和执行完毕时间保存到目标文件,目标文件的文件格式为指定可视化工具可识别的文件格式;将目标文件发送给可视化工具,以便可视化工具利用目标文件确定目标代码段的耗时,并将目标代码段的耗时转换为可视化数据。
[0076]
其中,代码段标识与名称映射字典打包在上述程序中。
[0077]
其中,目标文件即为上述“.trace”格式的文件。
[0078]
若采用自定义模式采集程序耗时数据,还可以对采集到的程序耗时数据进行过滤。具体的,获取目标代码段的开始执行时间与执行完毕时间之间的时间差;将该时间差与第一时间差阈值进行比较;若该时间差大于第一时间差阈值,保留目标代码段的第一耗时数据和第二耗时数据。第一时间差阈值可以在上述配置文件中配置。
[0079]
一种实现方式中,每获取一对第一耗时数据和第二耗时数据,即判断其中的时间差是否大于第一时间差阈值,对于时间差大于第一时间差阈值的目标代码段,将其第一耗时数据和第二耗时数据保存到上述中间文件或目标文件中。另一种实现方式中,对中间文件或目标文件中的各个目标代码段的上述时间差分别与第一时间差阈值比较,从中间文件或目标文件中删除时间差小于第一时间差阈值的目标代码段的程序耗时数据。
[0080]
本技术实施例提供的方法过滤掉耗时较短的目标代码段的耗时数据,从而达到压缩耗时数据的数据量的目的,可以进一步降低性能损耗。
[0081]
在此基础上,上述指定工作域是根据程序的历史目标代码段确定的,历史目标代码段为第一耗时数据和第二耗时数据被保留的历史代码段。
[0082]
更进一步的,若上述第一耗时数据和第二耗时数据保存到中间文件中,那么,可以根据历史中间文件确定指定作用域。
[0083]
本技术实施例提供的方法,根据历史目标代码段确定本次耗时数据采集的工作域,一方面可以压缩程序代码,另一方面也可以避免不必要的耗时数据采集,降低性能损耗。
[0084]
若采用自定义模式采集程序耗时数据,不仅可以对主线程中的代码段采集第一耗时数据和第二耗时数据,还可以对辅助线程中的代码段采集第一耗时数据和第二耗时数据。
[0085]
在此基础上,对目标代码段的耗时数据进行可视化处理的过程中,可以将关联的主线程上的代码段和辅助线程上的代码段进行关联可视化展示。
[0086]
程序的部分代码段(例如与显示界面相关的代码段)运行在主线程,部分代码段运行在辅助线程。在辅助线程中运行的某个代码段执行期间若占用某个内存区域,则该内存
区域的读写锁与该代码段绑定,在这期间,若主线程中运行的某个代码段也需要占用该内存区域,则需要等待上述代码段释放该内存区域的读写锁。代码段目前的耗时跟踪工具仅对程序的主线程中的代码段进行耗时跟踪,对于上述情况,主线程上运行的上述代码段的执行耗时较长,会被误认为该代码段为耗时较长的代码段,而实际情况并非如此。本技术实施例提供的方法不仅对主线程的代码段采集耗时数据,还对辅助线程的代码段采集耗时数据,对于上述情况,主线程和辅助线程的代码段的执行耗时均提供给开发人员,开发人员据此能够发现真正的耗时点,进而制定正确的耗时优化方案。
[0087]
在上述任意方法实施例的基础上,在目标代码段异常终止的情况下,还可以通过目标代码段的上级代码段调用结束指令结束目标代码段,上级代码段为调用目标代码段的代码段。
[0088]
其中,目标代码段异常终止的情况可以由开发人员通过可视化的耗时数据展示发现。
[0089]
若目标代码段异常终止,则第二插装方法无法获取到执行完毕时间,导致该目标代码段的耗时数据采集异常。采用本技术实施例提供的方法,在目标代码段异常终止的情况下,可以通过其上级代码段调用结束指令结束目标代码段,从而保证第二插装方法获取到执行完毕时间。
[0090]
实际应用中,可以在程序启动阶段自动调用本技术实施例提供的方法进行程序耗时数据采集。以移动终端上安装的程序为例,响应于用户触发而启动程序,并按照图2所示的处理过程进行程序耗时数据采集:
[0091]
步骤201、从配置文件中获取程序耗时数据采集模式。
[0092]
本实施例中,配置文件中指示的程序耗时数据采集模式为自定义模式。
[0093]
步骤202、在作用域内的每个被插桩的类方法开始执行时,采用第一插桩方法获取该类方法的第一耗时数据,并在该类方法执行完毕时,采用第二插桩方法获取该类方法的第二耗时数据。
[0094]
在程序启动阶段,重复该步骤对作用域内的各个被插桩的类方法采集程序耗时数据。
[0095]
本实施例中,作用域内的调用层级不超过调用层级阈值的类方法被插桩。
[0096]
本实施例中,第一耗时数据包括类方法标识、类方法所在线程的标识、类方法所在线程的名称、开始执行时间;第二耗时数据包括执行完毕时间。
[0097]
步骤203、每获取一个类方法的第一耗时数据和第二耗时数据,将获取到的第一耗时数据和第二耗时数据保存到中间文件中。
[0098]
实际应用中,可能因为类方法异常结束而无法获取到第二耗时数据,那么,仅将该类方法的第一耗时数据保存到中间文件中。
[0099]
步骤204、当程序启动阶段结束,将中间文件中保存的各个类方法的开始执行时间和执行完毕时间的时间差分别与时间差阈值进行比较,删除时间差小于时间差阈值的类方法的第一耗时数据和第二耗时数据。
[0100]
步骤205、获取类方法的名称与标识的映射字典,利用该映射字典查找过滤后的中间文件中的各个类方法的标识对应的名称,将类方法的标识、类方法的名称、所在线程的名称、所在线程的标识、开始执行时间和执行完毕时间按照目标数据格式保存到目标文件中。
[0101]
其中,目标文件为“.trace”格式的文件,目标数据格式为“.trace”格式的文件的数据格式。
[0102]
步骤206、将目标文件发送给应用服务器。
[0103]
其中,应用服务器将该目标文件发送给开发人员的终端设备,开发人员的终端设备利用所安装的systrace工具将目标文件中的数据进行可视化处理,得到可视化数据,并将可视化数据保存到“.html”格式的文件中。开发人员的终端设备在其显示屏上显示“.html”格式的文件,作为举例而非限定,该文件的显示界面如图3所示。
[0104]
其中,每个矩形框表示一个类方法的耗时,主线程虚线框中的各个矩形框表示主线程上的各个类方法的耗时,辅助线程中的矩形框表示辅助线程上的类方法的耗时。同一行的各个矩形框对应的类方法的调用层级相同,下一层矩形框对应的类方法被其上一行矩形框对应的类方法调用。各个矩形框的横向排列顺序反映了对应的各个类方法被调用的时间顺序。每个矩形框的横向宽度反映了类方法的耗时时长。
[0105]
实际应用中,还可以使用不同的填充颜色反映耗时等级。除此之外,还可以在矩形框中标出类方法名称。
[0106]
根据图3所示的可视化展示界面,开发人员可以快速定位耗时点。例如,通过图3可以看出,主线程中的类方法a和辅助线程中的类方法b均为耗时较长的类方法。开发人员通过进一步分析可以发现,主线程中的类方法a耗时时间长是因为等待辅助线程中的类方法b释放读写锁,因此,实际的耗时点在类方法b。
[0107]
通过可视化界面还易于发现异常结束的类方法。异常结束的类方法没有执行完毕时间,因此,在进行可视化处理时,可以对没有执行完毕时间的类方法进行异常标记。
[0108]
方法执行过程中发生异常后,被其调用者方法(上一级方法)捕获,发生异常方法的systracer.o方法未被调用。在外层捕获异常的位置,重新处理未出栈方法。
[0109]
实际应用中,还可以在程序运行阶段,根据指令调用本技术实施例提供的方法进行程序耗时数据采集。其数据采集过程可以参照图2所示的处理过程。
[0110]
基于与方法同样的发明构思,本技术实施例还提供一种电子设备,如图4所示,包括:
[0111]
第一耗时数据采集模块401,用于在程序的目标代码段开始执行时,使用所述目标代码段起始位置处的第一插桩方法获取所述目标代码段的第一耗时数据,所述第一耗时数据包括开始执行时间,所述目标代码段包括调用层级不超过调用层级阈值的代码段;
[0112]
第二耗时数据采集模块402,用于在所述目标代码段执行结束时,使用所述目标代码段结束位置处的第二插桩方法获取所述目标代码段的第二耗时数据,所述第二耗时数据包括执行完毕时间,所述目标代码段的第一耗时数据和第二耗时数据用于确定所述目标代码段的执行耗时。
[0113]
程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
[0114]
可选的,所述电子设备还包括层级控制模块,用于将所述程序的当前代码段对应
的栈深度与所述调用层级阈值进行比较,若所述栈深度不大于所述调用层级阈值,所述当前代码段为所述目标代码段。
[0115]
可选的,所述第一耗时数据和所述第二耗时数据中还包括所述目标代码段的标识,所述目标代码段所在线程的标识,所述电子设备还包括目标文件处理模块,用于:根据所述目标代码段的标识,在预定的代码段标识与名称映射字典中查找所述目标代码段的名称;按照指定可视化工具可识别的数据格式,将所述目标代码段的标识、所述目标代码段的名称、所述目标代码段所在线程的标识、所述开始执行时间和所述执行完毕时间保存到目标文件,所述目标文件的文件格式为所述指定可视化工具可识别的文件格式;将所述目标文件发送给所述可视化工具,以便所述可视化工具利用所述目标文件确定所述目标代码段的耗时,并将所述目标代码段的耗时转换为可视化数据。
[0116]
为了便于开发人员发现耗时点,可以可视化的形式呈现目标代码段的耗时。本技术实施例提供的电子设备得到并发送目标文件,以复用现有的可视化工具。
[0117]
在上述任意电子设备实施例的基础上,上述电子设备还可以包括数据过滤模块,用于获取目标代码段的开始执行时间与执行完毕时间之间的时间差;将该时间差与第一时间差阈值进行比较;若该时间差大于第一时间差阈值,保留目标代码段的第一耗时数据和第二耗时数据。
[0118]
本技术实施例提供的电子设备过滤掉耗时较短的目标代码段的耗时数据,从而达到压缩耗时数据的数据量的目的,可以进一步降低性能损耗。
[0119]
在此基础上,上述目标代码段包括程序的指定工作域内的代码段,指定工作域是根据程序的历史目标代码段确定的,历史目标代码段为第一耗时数据和第二耗时数据被保留的历史代码段。
[0120]
本技术实施例提供的电子设备,根据历史目标代码段确定本次耗时数据采集的工作域,一方面可以压缩程序代码,另一方面也可以避免不必要的耗时数据采集,降低性能损耗。
[0121]
在上述任意电子设备实施例的基础上,目标代码段可以包括程序的主线程中的代码段和程序的辅助线程中的代码段。
[0122]
程序的部分代码段(例如与显示界面相关的代码段)运行在主线程,部分代码段运行在辅助线程。在辅助线程中运行的某个代码段执行期间若占用某个内存区域,则该内存区域的读写锁与该代码段绑定,在这期间,若主线程中运行的某个代码段也需要占用该内存区域,则需要等待上述代码段释放该内存区域的读写锁。代码段目前的耗时跟踪工具仅对程序的主线程中的代码段进行耗时跟踪,对于上述情况,主线程上运行的上述代码段的执行耗时较长,会被误认为该代码段为耗时较长的代码段,而实际情况并非如此。本技术实施例提供的电子设备不仅对主线程的代码段采集耗时数据,还对辅助线程的代码段采集耗时数据,对于上述情况,主线程和辅助线程的代码段的执行耗时均提供给开发人员,开发人员据此能够发现真正的耗时点,进而制定正确的耗时优化方案。
[0123]
在上述任意电子设备实施例的基础上,该电子设备还可以包括异常处理模块,用于在目标代码段异常终止的情况下,通过目标代码段的上级代码段调用结束指令结束目标代码段,上级代码段为调用目标代码段的代码段。
[0124]
若目标代码段异常终止,则第二插装方法无法获取到执行完毕时间,导致该目标
代码段的耗时数据采集异常。采用本技术实施例提供的电子设备,在目标代码段异常终止的情况下,可以通过其上级代码段调用结束指令结束目标代码段,从而保证第二插装方法获取到执行完毕时间。
[0125]
上述各实施例中的电子设备可以包括智能手机、掌上电脑、平板电脑、带显示屏的可穿戴设备、车载电脑、智能音箱、个人计算机等等。
[0126]
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的移动终端的模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0127]
基于与方法同样的发明构思,本技术实施例提供一种电子设备,包括处理器和存储器;
[0128]
存储器用于存储执行上述任意方法实施例的程序;
[0129]
处理器被配置为执行存储器中存储的程序。
[0130]
程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的方法,仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
[0131]
该电子设备可以为移动终端,相应的,如图5所示,本技术实施例提供的移动终端不仅包括处理器和存储器,还包括输入设备(例如触摸屏、摄像头、传声器等)、输出设备(例如显示屏、扬声器等)、通信模块、电源模块。
[0132]
其中,存储器、输入设备、输出设备、通信模块、电源模块通过串口、总线或usb接口与处理器连接。其中,对于单处理器移动终端,处理器即cpu(中央处理器);对于双处理器移动终端,处理器包括主处理器和从处理器,由其主处理器执行应用程序实现本发明实施例提供的方法,若其中需要与外界进行通信,则由从处理器控制通信模块配合实现;对于包含gpu(图形处理器)和cpu的终端设备,处理器是指gpu和cpu,由gpu和cpu配合或由cpu单独实现本技术实施例提供的方法。
[0133]
其中,移动终端的存储器可以但不仅限于包括:flash(闪存)存储器、ram(随机存取存储器)、rom(只读存储器)等。ram主要用于存储移动终端运行时的程序和数据,需要执行的程序或者需要处理的数据都必须先装入ram内。rom主要用于检查终端设备操作系统的配置情况,并提供最基本的输入输出(i/o)程序。flash存储器是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)存储器,数据删除不是以单个的字节为单位,而是以固定的区块为单位。由于flash存储器断电时仍能保存数据,它通常被用来保存设置信息,如用户对移动终端的设置信息等。
[0134]
应当指出的是,针对不同的移动终端(单处理器智能手机、双处理器智能手机、智能穿戴设备、平板电脑等等),其可能包括比图5所示的移动终端更多或更少的硬件结构,但只要包括存储器和处理器,且能够实现上述方法实施例的功能,均在本公开的保护范围内。
[0135]
该电子设备还可以是计算机设备,例如个人计算机等。如图6所示,该计算机设备至少包括:电源,通过电源管理系统与中央处理器逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能;主板,提供部件之间的电连接通路,各个部件通过主板进行电信号传输,各个部件通过插接、焊接等方式安装在主板上;中央处理器,主要包括算
术逻辑运算单元(alu,arithmetic logic unit)、程序计数器(pc,program counter)、寄存器组、高速缓冲存储器(cache)以及用于传输数据、控制及状态的总线(bus)接口;内存储器、磁盘(即上述保存有执行各个方法实施例所述方法的程序的存储器)、输入单元(包括鼠标、键盘、触控面板等)、显示单元(包括显示屏和显卡)和网卡通过总线与中央处理器进行数据交换。
[0136]
基于与方法同样的发明构思,本技术实施例提供一种计算机可读存储介质,存储有实现上述任意方法实施例的程序。
[0137]
程序的代码段往往存在嵌套调用的情况,例如某个代码段被其上级代码段调用,该代码段在执行过程中还会调用其下级代码段。现有的耗时跟踪工具往往不限定调用层级,采集作用域内所有调用层级的代码段,导致性能损耗较大。本技术实施例提供的计算机可读存储介质中存储的程序仅采集调用层级不超过调用层级阈值的目标代码段的第一耗时数据和第二耗时数据,可以降低性能损耗,提高耗时跟踪的准确性。
[0138]
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,read only memory)、随机存取存储器(ram,random access memory)、磁盘或光盘等。
[0139]
上述所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献