CN112099798A - 公有函数执行耗时的统计方法、装置、存储介质及终端 - Google Patents
公有函数执行耗时的统计方法、装置、存储介质及终端 Download PDFInfo
- Publication number
- CN112099798A CN112099798A CN202010976378.0A CN202010976378A CN112099798A CN 112099798 A CN112099798 A CN 112099798A CN 202010976378 A CN202010976378 A CN 202010976378A CN 112099798 A CN112099798 A CN 112099798A
- Authority
- CN
- China
- Prior art keywords
- public function
- time
- application program
- virtual container
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000007619 statistical method Methods 0.000 title claims abstract description 15
- 238000000034 method Methods 0.000 claims abstract description 75
- 230000006870 function Effects 0.000 claims description 283
- 230000008569 process Effects 0.000 claims description 20
- 238000004590 computer program Methods 0.000 claims description 17
- 230000015654 memory Effects 0.000 claims description 15
- 238000012856 packing Methods 0.000 claims description 6
- 230000000007 visual effect Effects 0.000 claims description 6
- 238000004364 calculation method Methods 0.000 claims description 4
- 238000003672 processing method Methods 0.000 claims description 3
- 238000011161 development Methods 0.000 abstract description 9
- 238000010586 diagram Methods 0.000 description 6
- 239000008186 active pharmaceutical agent Substances 0.000 description 4
- 238000012216 screening Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000005034 decoration Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012544 monitoring process Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000012858 packaging process Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本申请涉及应用开发领域,具体涉及一种公有函数执行耗时的统计方法、装置、存储介质及终端,所述方法包括:在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过编译脚本向第三方资源文件中的公有函数插入判断代码;在应用程序业务代码运行时,根据判断代码获取线程当前的堆栈,并根据堆栈获取公有函数的调用信息,从调用信息确定应用程序业务代码运行时所调用的目标公有函数;获取所述目标公有函数的开始调用时间及结束调用时间,根据开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。本申请能够统计第三方资源文件中被应用程序业务层所调用的公有函数的执行耗时,减少冗余及无效数据,提高执行数据统计的效率。
Description
技术领域
本申请涉及应用开发领域,具体涉及一种公有函数执行耗时的统计方法、装置、存储介质及终端。
背景技术
SDK一般指软件开发工具包,在安卓项目开发的过程中,或多或少都会接入第三方SDK进行开发,第三方SDK也称为第三方资源文件,在接入第三方SDK后,需要统计安卓项目中各个SDK的方法的调用耗时来得知各个SDK的具体性能,目前是通过对SDK代码中的各个方法函数手动埋点,监控各个方法的运行后进行上报,该手动埋点的方法会因覆盖不全而导致无法精确统计SDK的各个方法函数,而且每一次的埋点、统计需要根据SDK接口的改动而改动;另一种方法是对SDK中所有的方法函数进行监控后上报,对所有方法注入进行监控会覆盖冗余接口,导致冗余数据、无效数据过多,耗费了大量的资源。
发明内容
为克服以上技术问题,特别是现有技术无法高效统计接入的第三方资源文件中的方法函数的调用耗时的问题,特提出以下技术方案:
第一方面,本申请提供了一种公有函数执行耗时的统计方法,包括:
在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;
在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;
获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
进一步的,所述从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,包括:
从所述调用信息判断当前线程是否有公有函数调用虚拟容器;
若有,存储所述公有函数的签名和调用时间至所述虚拟容器中;
从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空;
若是,确定所述公有函数为应用程序业务代码运行时所调用的目标公有函数。
进一步的,所述从所述调用信息判断当前线程是否有公有函数调用虚拟容器之后,还包括:
若无,获取当前线程的线程id;
根据所述线程id创建公有函数调用虚拟容器;
存储所述公有函数的签名和调用时间至所述虚拟容器中。
进一步的,所述获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,包括:
从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间;
所述从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空之后,还包括:
若当前线程虚拟容器为空,才执行根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据;
若当前线程虚拟容器不为空,结束流程。
进一步的,所述第三方资源文件包括jar包和/或aar包;所述在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向第三方资源文件中的公有函数插入判断代码,包括:
在应用程序的编译期间,配置Gradle插件编译脚本;
通过Gradle插件扫描编译期间的应用程序的jar包和/或aar包;遍历所述jar包和/或aar包的class文件,确定所述class文件中的公有函数;向所述class文件中的公有函数插入判断代码;
将插入所述判断代码的jar包和/或aar包进行打包压缩恢复为第三方资源文件。
进一步的,所述根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据之后,还包括:
上报所述目标函数的执行耗时数据。
进一步的,所述上报所述目标函数的执行耗时数据,包括:
将所述公有函数的执行耗时数据以可视化的图像输出,并将所述图像上报。
第二方面,本申请提供一种公有函数执行耗时的统计装置,包括:
配置模块:用于在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;
判断模块:用于在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;
计算模块:用于获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
第三方面,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述的公有函数执行耗时的统计方法。
第四方面,本申请还提供了一种控制终端,所述控制终端包括一个或多个处理器、存储器、一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个计算机程序配置用于执行上述的公有函数执行耗时的统计方法。
本申请与现有技术相比,具有以下有益效果:
本申请提供了一种统计应用程序接入的第三方资源文件中的公有函数执行耗时的方法,通过在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码,所述判断代码通过模拟运行期线程调用方法堆栈的原理,获取线程当前的堆栈,再从所述堆栈中获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,通过模拟运行期线程调用堆栈的原理筛选出在应用程序运行期间被业务层所调用的公有函数,再获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,从而在业务无感知的情况下,实现对第三方资源文件中的目标公有函数进行监控,且对真正属于被业务层调用的公有函数的执行耗时进行上报,精确查找到目标公有函数并对该目标公有函数的执行耗时进行统计、上报,减少统计内部调用的公有函数而造成冗余及无效数据,提高目标公有函数执行数据统计的效率,提高应用程序性能优化效率。
本申请附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本申请的实践了解到。
附图说明
本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本申请公有函数执行耗时的统计方法的一实施例流程示意图;
图2为本申请判断代码的逻辑流程的一实施例示意图;
图3为本申请配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向第三方资源文件中的公有函数插入判断代码的一实施例流程示意图;
图4为本申请以可视化的图像输出所述目标公有函数的执行耗时数据的一实施例示意图;
图5为本申请公有函数执行耗时的统计装置的一实施例示意图;
图6为本申请控制终端的一实施例结构示意图。
具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能解释为对本申请的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本申请所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本申请实施例提供一种公有函数执行耗时的统计方法,如图1所示,所述方法包括以下步骤:
S10:在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码。
本实施例可以应用于应用程序的开发过程中,包括应用于安卓(Android)项目或安卓(Android)应用程序的开发过程,应用程序的开发需要经过编译后生成.apk文件,应用程序的开发过程会引入第三方资源库或者第三方资源文件,即接入第三方SDK,第三方资源文件中包含了应用程序运行过程需要调用到的方法函数,该些第三方资源文件中的方法函数有利于应用程序的功能拓展以及便捷开发,本实施例中,在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,即改写编译流程,以便在编译的过程中,获取接入的第三方资源文件,然后通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码,当新接入第三方资源文件后,在将应用程序编译的过程中,通过所述编译脚本便可以对接入的第三方资源文件中的公有函数插入判断代码。
S20:在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数。
在对编译期间的应用程序的第三方资源文件中的公有函数插入判断代码后,执行应用程序业务代码运行,所述应用程序业务代码运行可以由所述编译脚本模拟运行,或实际开发过程中的调试运行或实际应用程序的运行,所述判断代码通过模拟运行期线程调用方法堆栈的原理,根据所述判断代码获取线程当前的堆栈,再从所述堆栈中获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,例如从所述堆栈中获取公有函数的调用信息为“应用程序调用public a,public a调用publicb,public b调用public c”,此时则确定公有函数public a为应用程序业务代码运行时所调用的目标公有函数,即所述公有函数public a为在应用程序运行期间被业务层所调用的函数,而公有函数public b、public c则为内部调用函数,并非为业务层所调用。从而在业务无感知的情况下,实现对第三方资源文件中的目标公有函数进行监控。
S30:获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
在确定了目标函数后,获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,在一种实施方式中,所述获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据的执行代码亦包含在所述判断代码中,在根据所述判断代码判断所述目标公有函数在应用程序运行期间被业务层所调用后,则获取所述目标函数函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标函数的执行耗时数据,从而通过无侵入式埋点的方法对第三方资源文件中的目标函数进行监控,且对真正属于被业务层调用的公有函数的执行耗时进行上报,精确查找到目标公有函数并对该目标公有函数的执行耗时进行统计、上报,减少统计内部调用的公有函数而造成冗余及无效数据,提高目标公有函数执行数据统计的效率,提高应用程序性能优化效率。
本实施例提供了一种统计应用程序接入的第三方资源文件中的公有函数执行耗时的方法,通过在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码,所述判断代码通过模拟运行期线程调用方法堆栈的原理,获取线程当前的堆栈,再从所述堆栈中获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,通过模拟运行期线程调用堆栈的原理筛选出在应用程序运行期间被业务层所调用的公有函数,再获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,从而在业务无感知的情况下,实现对第三方资源文件中的目标公有函数进行监控,且对真正属于被业务层调用的公有函数的执行耗时进行上报,精确查找到目标公有函数并对该目标公有函数的执行耗时进行统计、上报,减少统计内部调用的公有函数而造成冗余及无效数据,提高目标公有函数执行数据统计的效率,提高应用程序性能优化效率。
本申请的一种实施例,所述S20中的从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,包括:
从所述调用信息判断当前线程是否有公有函数调用虚拟容器;
若有,存储所述公有函数的签名和调用时间至所述虚拟容器中;
从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空;
若是,确定所述公有函数为应用程序业务代码运行时所调用的目标公有函数。
本实施例中,所述判断代码通过堆栈的原理获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,堆栈是一种数据结构,一种数据项按序排列的数据结构,具体的,所述判断代码当公有函数方法调用开始时,判断当前线程是否有公有函数调用虚拟容器,若有,则说明该公有函数方法调用了虚拟容器,此时,存储所述公有函数的签名以便对公有函数的执行数据进行分类、记录,同时存储所述公有函数的调用时间至所述虚拟容器中,然后当所述公有函数结束调用后,从当前线程的虚拟容器中执行弹出操作,即对虚拟容器执行出栈,然后判断当前线程虚拟容器是否为空,若为空则确定当前线程虚拟容器中没有公有函数占用,即此前占用虚拟容器的公有函数在执行结束后即结束对虚拟容器的占用,此时便可确定所述公有函数是在应用程序运行期间被业务层所调用,确定所述公有函数为应用程序业务代码运行时所调用的目标公有函数,通过堆栈的原理精确地筛选出目标公有函数,避免对所有公有函数进行统计而耗费大量的资源,提高资源的利用率。
本申请的一种实施例,上述实施例中的从所述调用信息判断当前线程是否有公有函数调用虚拟容器之后,还包括:
若无,获取当前线程的线程id;
根据所述线程id创建公有函数调用虚拟容器;
存储所述公有函数的签名和调用时间至所述虚拟容器中。
在上述实施例的判断所述公有函数是否在应用程序运行期间被业务层所调用过程中,在执行所述公有函数并开始调用,判断当前线程是否有公有函数调用虚拟容器之后,若当前线程中没有公有函数调用虚拟容器,此时,需要为已经开始执行的公有函数创建并调用虚拟容器,具体的,先获取当前线程的线程id,通过当前线程id创建公有函数所私有的虚拟容器,然后再使所述公有函数调用所述虚拟容器,以存储所述公有函数的签名和调用时间至所述虚拟容器中,然后执行所述公有函数至结束调用,再根据堆栈的原理,从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空;若是,确定所述公有函数在应用程序运行期间被业务层所调用,提高了场景应用的广泛性,精确地筛选出目标公有函数。
如图2所示是判断代码的一实施例逻辑流程图,在公有函数方法调用开始时,判断当前线程是否有公有函数方法(图2中简称为方法)调用虚拟函数,若是,则存储该方法的签名和调用时间到虚拟容器中,若否,则根据当前线程的线程id创建公有函数调用虚拟容器,再存储该公有函数方法的签名和调用时间到虚拟容器中,然后当公有函数方法调用执行结束后,对当前线程虚拟容器执行推出(pop)操作,再判断当前线程虚拟容器是否为空,若为空,则确定所述调用虚拟容器的公有函数方法为目标公有函数,此时上报该目标公有函数方法的执行耗时数据,然后结束所述判断代码的逻辑流程,若判断当前线程虚拟容器不为空,则说明执行对当前线程虚拟容器执行推出(pop)操作不影响公有函数调用虚拟容器,此时则确定该公有函数不调用虚拟容器,则直接结束所述判断代码的逻辑流程,不需要对该公有函数的执行耗时数据进行统计及上报,从而降低资源的消耗,提高资源的利用率,提高目标函数的执行耗时的统计效率。
本申请的一种实施例,所述S30中的获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,包括:
从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间;
所述从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空之后,还包括:
若当前线程虚拟容器为空,才执行根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据;
若当前线程虚拟容器不为空,结束流程。
在实际的运行过程中,并非所有的公有函数都是在应用程序运行期间被业务层所调用,即并非第三方资源文件中的所有公有函数都是目标公有函数,因此所述获取所述目标公有函数的开始调用时间及结束调用时间是从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间,另外,本实施例中通过虚拟容器中的堆栈原理进行判断对哪些公有函数的执行耗时进行统计,具体的,在所述公有函数从开始调用至结束调用后,从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空,若所述当前线程虚拟容器为空,才根据从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间确定所述目标函数的执行耗时数据,而若当前线程虚拟容器不为空,则确定所述公有函数并非是在应用程序运行期间被业务层所调用,此时结束判断代码的流程,无需再统计该公有函数的执行耗时,减少资源的浪费。
本申请的一种实施例,所述第三方资源文件包括jar包和/或aar包;如图3所示,所述S10中的在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向第三方资源文件中的公有函数插入判断代码,包括:
S101:在应用程序的编译期间,配置Gradle插件编译脚本;
S102:通过Gradle插件扫描编译期间的应用程序的jar包和/或aar包;遍历所述jar包和/或aar包的class文件,确定所述class文件中的公有函数;向所述class文件中的公有函数插入判断代码;
S103:将插入所述判断代码的jar包和/或aar包进行打包压缩恢复为第三方资源文件。
本实施例中,所述第三方资源文件包括jar包和/或aar包,在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向第三方资源文件中的公有函数插入判断代码的过程中,包括编译过程及打包过程,编译过程是将待编译的内容包括工程文件以及依赖的各种库文件(第三方资源文件jar包和/或aar包),编译输出为包括dex文件和编译后的资源文件,具体的,在应用程序的编译期间,配置Gradle插件编译脚本,通过Gradle插件扫描编译期间的应用程序的jar包和/或aar包,Gradle插件的打包过程需要用到Transform API,通过Transform API遍历所述jar包和/或aar包的class文件并且通过该改写Transform API使得在遍历了所述jar包和/或aar包的class文件时查找所述class文件中的公有函数,然后向所述class文件中的公有函数插入判断代码,完成对接入的第三方资源文件的改写,然后将插入所述判断代码的jar包和/或aar包进行打包压缩,打包成可用的dex文件和编译后的资源文件,以便为后续的对第三方资源文件中的公有函数执行耗时的统计提供基础,本实施例通过在编译期间基于编译脚本对第三方资源文件中的公有函数插入判断代码,业务不需要修改各个第三方资源文件的代码便能够完成无侵入地插入判断代码,保留了无代码侵入的原则,提高对第三方资源文件中的公有函数进行监控的便捷性。
本申请的一种实施例,所述S30中的根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据之后,还包括:
上报所述目标公有函数的执行耗时数据。
本实施例中,在计算了所述目标公有函数的执行耗时数据,将所述目标公有函数的执行耗时数据进行上报,上报的执行耗时数据包括目标公有函数的开始调用时间、结束调用时间、每一次调用的执行耗时数据、多次调用的平均执行耗时数据,从而可以直观地了解第三方资源文件的目标公有函数方法的调用平均耗时,并且能够快速地定位执行耗时数据异常的目标公有函数,从而为应用程序启动效率的优化提供数据基础。
本申请的一种实施例,所述上报所述目标公有函数的执行耗时数据,包括:
将所述目标公有函数的执行耗时数据以可视化的图像输出,并将所述图像上报。
本实施例中,所述目标公有函数的执行耗时数据以可视化的图像输出,并将所述图像上报,通过图像输出可以直观地了解各个目标公有函数的执行耗时数据,统计应用程序不同模块启动的平均执行耗时,并且基于可视化的图像可以直接定位执行耗时数据异常的目标公有函数,从而提高应用程序性能优化效率。如图4所示是以可视化的图像输出所述目标公有函数的执行耗时数据的一实施例示意图。
如图5所示,在另一种实施例中,本申请提供了一种公有函数执行耗时的统计装置,包括:
配置模块10:用于在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;
判断模块20:用于在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;
计算模块30:用于获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
本申请的一种实施例,所述判断模块20还包括执行:
从所述调用信息判断当前线程是否有公有函数调用虚拟容器;
若有,存储所述公有函数的签名和调用时间至所述虚拟容器中;
从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空;
若是,确定所述公有函数为应用程序业务代码运行时所调用的目标公有函数。
本申请的一种实施例,所述判断模块20还包括执行:
从所述调用信息判断当前线程是否有公有函数调用虚拟容器;
若无,获取当前线程的线程id;
根据所述线程id创建公有函数调用虚拟容器;
存储所述公有函数的签名和调用时间至所述虚拟容器中。
本申请的一种实施例,所述计算模块30还包括执行:
从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间;
在所述从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空之后,还包括:
若当前线程虚拟容器为空,才执行根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据;
若当前线程虚拟容器不为空,结束流程。
本申请的一种实施例,所述配置模块10还包括执行:
在应用程序的编译期间,配置Gradle插件编译脚本;
通过Gradle插件扫描编译期间的应用程序的jar包和/或aar包;遍历所述jar包和/或aar包的class文件,确定所述class文件中的公有函数;向所述class文件中的公有函数插入判断代码;
将插入所述判断代码的jar包和/或aar包进行打包压缩恢复为第三方资源文件。
本申请的一种实施例,所述装置还包括数据上报模块:用于上报所述目标公有函数的执行耗时数据。
本申请的一种实施例,所述数据上报模块还包括执行:将所述目标公有函数的执行耗时数据以可视化的图像输出,并将所述图像上报。
在另一种实施例中,本申请提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例所述的公有函数执行耗时的统计方法。其中,所述计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(RandomAcceSS Memory,随即存储器)、EPROM(EraSable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically EraSable Programmable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储设备包括由设备以能够读的形式存储或传输信息的任何介质,可以是只读存储器,磁盘或光盘等。
本申请实施例提供的一种计算机可读存储介质,可实现在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。通过提供一种统计应用程序接入的第三方资源文件中的公有函数执行耗时的方法,通过在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码,所述判断代码通过模拟运行期线程调用方法堆栈的原理,获取线程当前的堆栈,再从所述堆栈中获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,通过模拟运行期线程调用堆栈的原理筛选出在应用程序运行期间被业务层所调用的公有函数,再获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,从而在业务无感知的情况下,实现对第三方资源文件中的目标公有函数进行监控,且对真正属于被业务层调用的公有函数的执行耗时进行上报,精确查找到目标公有函数并对该目标公有函数的执行耗时进行统计、上报,减少统计内部调用的公有函数而造成冗余及无效数据,提高目标公有函数执行数据统计的效率,提高应用程序性能优化效率。
本申请实施例提供的计算机可读存储介质可以实现上述公有函数执行耗时的统计方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
此外,在又一种实施例中,本申请还提供一种控制终端,如图6所示,所述控制终端包括处理器403、存储器405、输入单元407以及显示单元409等器件。本领域技术人员可以理解,图6示出的结构器件并不构成对所有控制终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件。所述存储器405可用于存储计算机程序401以及各功能模块,所述处理器403运行存储在存储器405的计算机程序401,从而执行设备的各种功能应用以及数据处理。
在一种实施方式中,所述控制终端包括一个或多个处理器403,以及一个或多个存储器405,一个或多个计算机程序401,其中所述一个或多个计算机程序401被存储在存储器405中并被配置为由所述一个或多个处理器403执行,所述一个或多个计算机程序401配置用于执行以上实施例所述的动态手势动作识别方法。图6中所示的一个或多个处理器403能够执行、实现图5中所示的配置模块10、判断模块20、计算模块30的功能。
本申请实施例提供的一种控制终端,可实现在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。通过提供一种统计应用程序接入的第三方资源文件中的公有函数执行耗时的方法,通过在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码,所述判断代码通过模拟运行期线程调用方法堆栈的原理,获取线程当前的堆栈,再从所述堆栈中获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,通过模拟运行期线程调用堆栈的原理筛选出在应用程序运行期间被业务层所调用的公有函数,再获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,从而在业务无感知的情况下,实现对第三方资源文件中的目标公有函数进行监控,且对真正属于被业务层调用的公有函数的执行耗时进行上报,精确查找到目标公有函数并对该目标公有函数的执行耗时进行统计、上报,减少统计内部调用的公有函数而造成冗余及无效数据,提高目标公有函数执行数据统计的效率,提高应用程序性能优化效率。
本申请实施例提供的控制终端可以实现上述提供的公有函数执行耗时的统计方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
以上所述仅是本申请的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (10)
1.一种公有函数执行耗时的统计方法,其特征在于,包括以下步骤:
在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;
在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;
获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
2.根据权利要求1所述的方法,其特征在于,所述从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数,包括:
从所述调用信息判断当前线程是否有公有函数调用虚拟容器;
若有,存储所述公有函数的签名和调用时间至所述虚拟容器中;
从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空;
若是,确定所述公有函数为应用程序业务代码运行时所调用的目标公有函数。
3.根据权利要求2所述的方法,其特征在于,所述从所述调用信息判断当前线程是否有公有函数调用虚拟容器之后,还包括:
若无,获取当前线程的线程id;
根据所述线程id创建公有函数调用虚拟容器;
存储所述公有函数的签名和调用时间至所述虚拟容器中。
4.根据权利要求2所述的方法,其特征在于,所述获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据,包括:
从所述虚拟容器中获取目标函数的开始调用时间及结束调用时间;
所述从当前线程的虚拟容器中执行弹出操作,并判断当前线程虚拟容器是否为空之后,还包括:
若当前线程虚拟容器为空,才执行根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据;
若当前线程虚拟容器不为空,结束流程。
5.根据权利要求1所述的方法,其特征在于,所述第三方资源文件包括jar包和/或aar包;所述在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向第三方资源文件中的公有函数插入判断代码,包括:
在应用程序的编译期间,配置Gradle插件编译脚本;
通过Gradle插件扫描编译期间的应用程序的jar包和/或aar包;遍历所述jar包和/或aar包的class文件,确定所述class文件中的公有函数;向所述class文件中的公有函数插入判断代码;
将插入所述判断代码的jar包和/或aar包进行打包压缩恢复为第三方资源文件。
6.根据权利要求1所述的方法,其特征在于,所述根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据之后,还包括:
上报所述目标公有函数的执行耗时数据。
7.根据权利要求6所述的方法,其特征在于,所述上报所述目标公有函数的执行耗时数据,包括:
将所述目标公有函数的执行耗时数据以可视化的图像输出,并将所述图像上报。
8.一种公有函数执行耗时的统计装置,其特征在于,包括:
配置模块:用于在应用程序的编译期间,配置应用程序的第三方资源文件的编译脚本,通过所述编译脚本向所述第三方资源文件中的公有函数插入判断代码;
判断模块:用于在应用程序业务代码运行时,根据所述判断代码获取线程当前的堆栈,并根据所述堆栈获取公有函数的调用信息,从所述调用信息确定应用程序业务代码运行时所调用的目标公有函数;
计算模块:用于获取所述目标公有函数的开始调用时间及结束调用时间,根据所述开始调用时间及结束调用时间确定所述目标公有函数的执行耗时数据。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1至7任一项所述的公有函数执行耗时的统计方法。
10.一种控制终端,其特征在于,包括:
一个或多个处理器;
存储器;
一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个计算机程序配置用于执行根据权利要求1至7任一项所述的公有函数执行耗时的统计方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010976378.0A CN112099798B (zh) | 2020-09-16 | 2020-09-16 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010976378.0A CN112099798B (zh) | 2020-09-16 | 2020-09-16 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112099798A true CN112099798A (zh) | 2020-12-18 |
CN112099798B CN112099798B (zh) | 2024-04-19 |
Family
ID=73758671
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010976378.0A Active CN112099798B (zh) | 2020-09-16 | 2020-09-16 | 公有函数执行耗时的统计方法、装置、存储介质及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112099798B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112698890A (zh) * | 2020-12-31 | 2021-04-23 | 百果园技术(新加坡)有限公司 | 函数耗时采集方法、装置、设备及存储介质 |
CN115168059A (zh) * | 2022-09-07 | 2022-10-11 | 平安银行股份有限公司 | 系统内核监测方法、装置、终端设备及存储介质 |
WO2022262472A1 (zh) * | 2021-06-18 | 2022-12-22 | Oppo广东移动通信有限公司 | 帧率处理方法、装置、存储介质以及终端 |
CN117149632A (zh) * | 2023-08-31 | 2023-12-01 | 重庆赛力斯新能源汽车设计院有限公司 | 分析车载应用程序冷启动的方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365716A (zh) * | 2013-06-25 | 2013-10-23 | 华为技术有限公司 | 业务操作任务中的数据跟踪方法、装置及主机 |
CN109614290A (zh) * | 2018-12-10 | 2019-04-12 | 苏州思必驰信息科技有限公司 | 容器中的进程异常信息记录方法及系统 |
CN110134400A (zh) * | 2019-04-02 | 2019-08-16 | 北京奇艺世纪科技有限公司 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
CN110457277A (zh) * | 2019-08-19 | 2019-11-15 | 北京博睿宏远数据科技股份有限公司 | 业务处理性能分析方法、装置、设备及存储介质 |
CN111104104A (zh) * | 2019-11-04 | 2020-05-05 | 珠海亿智电子科技有限公司 | 函数调用时间和统计结果可视化的方法、装置及可读介质 |
-
2020
- 2020-09-16 CN CN202010976378.0A patent/CN112099798B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365716A (zh) * | 2013-06-25 | 2013-10-23 | 华为技术有限公司 | 业务操作任务中的数据跟踪方法、装置及主机 |
CN109614290A (zh) * | 2018-12-10 | 2019-04-12 | 苏州思必驰信息科技有限公司 | 容器中的进程异常信息记录方法及系统 |
CN110134400A (zh) * | 2019-04-02 | 2019-08-16 | 北京奇艺世纪科技有限公司 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
CN110457277A (zh) * | 2019-08-19 | 2019-11-15 | 北京博睿宏远数据科技股份有限公司 | 业务处理性能分析方法、装置、设备及存储介质 |
CN111104104A (zh) * | 2019-11-04 | 2020-05-05 | 珠海亿智电子科技有限公司 | 函数调用时间和统计结果可视化的方法、装置及可读介质 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112698890A (zh) * | 2020-12-31 | 2021-04-23 | 百果园技术(新加坡)有限公司 | 函数耗时采集方法、装置、设备及存储介质 |
WO2022262472A1 (zh) * | 2021-06-18 | 2022-12-22 | Oppo广东移动通信有限公司 | 帧率处理方法、装置、存储介质以及终端 |
CN115168059A (zh) * | 2022-09-07 | 2022-10-11 | 平安银行股份有限公司 | 系统内核监测方法、装置、终端设备及存储介质 |
CN115168059B (zh) * | 2022-09-07 | 2022-12-16 | 平安银行股份有限公司 | 系统内核监测方法、装置、终端设备及存储介质 |
CN117149632A (zh) * | 2023-08-31 | 2023-12-01 | 重庆赛力斯新能源汽车设计院有限公司 | 分析车载应用程序冷启动的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112099798B (zh) | 2024-04-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112099798A (zh) | 公有函数执行耗时的统计方法、装置、存储介质及终端 | |
US20190324772A1 (en) | Method and device for processing smart contracts | |
US7167881B2 (en) | Method for heap memory management and computer system using the same method | |
CN107832100B (zh) | 一种apk插件的加载方法及其终端 | |
JP5147728B2 (ja) | 質的に注釈を付けられた注釈付きコード | |
CN108021357B (zh) | 程序调用的优化方法及装置 | |
CN110765026A (zh) | 自动化测试方法、装置、存储介质及设备 | |
CN112667405A (zh) | 信息处理方法、装置、设备及存储介质 | |
US20180059978A1 (en) | Virtual disk expansion method and apparatus | |
CN111258557A (zh) | 代码处理方法、装置、电子设备及计算机可读介质 | |
CN112559088A (zh) | 配置文件的优化方法、装置、服务器以及存储介质 | |
CN112181388B (zh) | Sdk组件的初始化方法、装置、存储介质及控制终端 | |
CN108446224B (zh) | 移动端上应用程序的性能分析方法、存储介质 | |
CN111797025B (zh) | 一种针对应用的数据处理方法及装置 | |
CN112199042A (zh) | 存储空间管理方法、装置、芯片、设备及存储介质 | |
CN116126937A (zh) | 作业调度方法、装置、电子设备及存储介质 | |
CN107908391B (zh) | 程序调用的优化方法及装置 | |
US20060265687A1 (en) | Method for Finding a Function Call Stack in Run Time for a Computer System | |
CN111190658A (zh) | 一种基于片内执行且在不具有MMU的SoC片上支持应用程序动态加载的系统 | |
CN111061538A (zh) | 一种多Lua虚拟机内存优化方法及其系统 | |
CN113268280B (zh) | 动态加载插件的方法、装置及电子设备 | |
CN116661905B (zh) | 一种基于动态库加载实现设备自动适配方法以及系统 | |
WO2021121188A1 (zh) | 配置文件的处理方法、装置、系统及存储介质 | |
CN110008039B (zh) | 接口控制方法、装置、计算机可读存储介质和计算机设备 | |
CN117591327A (zh) | core文件生成方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |