代码处理方法、装置、电子设备及计算机可读介质与流程

专利2022-06-29  97


本申请涉及计算机技术领域,更具体地,涉及一种代码处理方法、装置、电子设备及计算机可读介质。



背景技术:

目前,javascript引擎通过字节码解释和热点代码编译成机器码的方式来执行javascript源代码,即通过编译器将java源码编译成字节码,通过jvm(javavirtualmachine,java虚拟机)的解释器将字节码逐行解释为机器指令并执行。

当虚拟机发现某个方法或者代码块运行特别频繁时,就会把这些代码认定为“hotspotcode”(热点代码),将之记录下来保存到profile文件,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成机器码。

目前,确定热点代码的方式大多是统计方法函数或代码块的执行次数,将次数较高的方法函数或代码块作为热点代码,使得热点代码的确定不够准确。



技术实现要素:

本申请提出了一种代码处理方法、装置、电子设备及计算机可读介质,以改善上述缺陷。

第一方面,本申请实施例提供了一种代码处理方法,包括:获取编译单元的代码数量;获取编译单元的被执行次数;根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码;若所述编译单元为热点代码,则执行预设操作。

第二方面,本申请实施例还提供了代码处理装置,包括:第一获取模块、第二获取模块、确定模块和执行模块。第一获取模块,用于获取编译单元的代码数量。第二获取模块,用于获取编译单元的被执行次数。确定模块,用于根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码。执行模块,用于若所述编译单元为热点代码,则执行预设操作。

第三方面,本申请实施例还提供了一种电子设备,包括:一个或多个处理器;存储器;一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于执行上述方法。

第四方面,本申请实施例还提供了一种计算机可读介质,所述计算机可读介质存储有处理器可执行的程序代码,所述程序代码被所述处理器执行时使所述处理器执行上述方法。

本申请提供的代码处理方法、装置、电子设备及计算机可读介质,分别获取编译单元的代码数量和被执行次数,并且根据代码数量和所述被执行次数,确定所述编译单元是否为热点代码,在确定编译单元为热点代码的情况下,执行预设操作。因此,基于编译单元的代码数量和被执行次数来确定编译单元是否为热点代码,相比仅根据执行次数来确定热点代码而言,使得判断维度更加丰富,使得热点代码的确定更加准确。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了现有技术提供的一种确定热点代码的方法示意图;

图2示出了本申请一实施例提供的一种代码处理方法的方法流程图;

图3示出了本申请另一实施例提供的一种代码处理方法的方法流程图;

图4示出了本申请一实施例提供的一种代码处理装置的模块框图;

图5示出了本申请另一实施例提供的一种代码处理装置的模块框图;

图6示出了本申请实施例提供的电子设备的模块框图;

图7出了本申请实施例提供的用于保存或者携带实现根据本申请实施例的代码处理方法的程序代码的存储单元。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。

目前,javascript引擎通过字节码解释和热点代码编译成机器码的方式来执行javascript源代码。其中,javascript引擎是一个专门处理javascript脚本的虚拟机。

android有两种虚拟机执行环境:dalvik和art。在dalvik虚拟机下,应用每次运行的时候,字节码都需要通过即时编译器(jit)转换为机器码,才能被机器运行,这会拖慢应用的执行效率。在android4.4时,art虚拟机开始替代dalvik,在最开始的art虚拟机中,应用在第一次安装的时候,系统会通过一个名称为dex2oat的工具将apk中的dex文件编译成包含本地机器码的oat文件存放下来。这样做之后,在程序执行的时候,就可以直接使用已经编译好的机器码以加快效率,这种预先编译机器码的机制叫做aot。aot的缺点是应用安装和系统升级之后的应用优化过程比较耗时(需要重新将dex字节码编译成本地机器码),且优化后的文件会占用额外的存储空间。

android平台的绝大多数应用是使用java语言写的,java程序最初仅仅通过java解释器(interpreter)解释执行,即对字节码逐条解释执行,这种方式的执行速度相对会比较慢,尤其当某个方法或代码块运行特别频繁时,这种方式的执行效率就显得很低。于是后来在虚拟机中引入了jit编译器,当虚拟机发现某个方法或者代码块运行特别频繁时,就会把这些代码认定为“hotspotcode”(热点代码),将之记录下来保存到profile文件,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,而正是由jit编译器负责这项任务。

简单而言,profile文件记录了应用频繁运行的方法或者代码块,经由jit或者aot编译后得到.odex/.oat文件,该文件存有这些热点代码编译而成的二进制机器码,可直接交由底层cpu执行,从而提高了运行速度。

目前,热点代码的确定方式为,javascript引擎执行代码执行次数的统计操作,具体地,周期性地采样各个线程的栈顶的编译单元,基于计数器统计编译单元位于线程的栈顶的次数,如果该编译单元的执行次数大于一定数量,则判定该编译单元为热点代码,并且将该热点代码编译成机器码。其中,编译单元可以是函数(又称“方法”)或类,每个编译单元具有对应的单元描述信息,每个编译单元的单元描述信息用于描述该编译单元的功能。

但是,发明人在研究中发现,目前的热点代码确定方法都是基于单个指标来判定热点代码,其中,该指标为代码执行次数。针对一些频繁被执行的编译单元,通过单个指标尚且能够准确确定热点代码,而对应一些代码数量繁多的编译单元,运行次数普遍比较低,如果此时依然仅采用执行次数来确定热点代码,则会导致代码数量繁多的编译单元很难被判定为热点代码,而使得该编译单元错过了运行时编译成机器码的机会,这便降低了javascript源码的执行速度。如图1所示,示出了一种确定热点代码的方法示意图。代码a内包括100行js代码,代码b内包括10行js代码,代码a的代码数量大于代码b的代码数量,统计模块负责统计代码a和代码b的被执行的次数,则统计结果为代码a被执行5次,代码b被执行20次,假设当前的次数阈值为15,则代码b的被执行次数大于次数阈值,则代码b被判定为热点代码,而代码a的被执行次数小于次数阈值,则代码a被判定为非热点代码。代码a因为代码数量过大,导致被执行次数过低,而无法被判定为热点代码。

因此,为了克服上述缺陷,本申请实施例提供了一种代码处理方法,如图2所示,该方法包括:s201至s204。

s201:获取编译单元的代码数量。

其中,编译单元的代码数量可以是编译单元内的代码行数,则获取编译单元的代码数量可以统计编译单元的代码行数,将该代码行数作为该编译单元的代码数量。如图1所示,代码a的代码数量为100行,代码b的代码数量为10行。

另外,编译单元的代码数量还可以是编译单元的数据大小,即编译单元所占用的存储空间的大小,则该数据大小与编译单元内的代码的数量成正比,即代码的数量越多,则数据大小越大。

s202:获取编译单元的被执行次数。

作为一种实施方式,本申请实施例所提供的方法应用电子设备,则电子设备的操作系统内设置有统计模块,该统计模块可以是一个服务。该统计模块用于统计编译单元的被执行次数。

在一些实施例中,当编译单元被执行的时候,会返回一个指定信息至统计模块,则统计模块在获取到该指定信息的时候,能够知晓编译单元被执行,则统计所获取的指定信息的次数,就能够统计得到编译单元的被执行次数。其中,可以在编译单元内插入一个程序代码,该程序代码用于在被执行的时候,发送一个指定信息至统计模块。其中,该程序代码可以插入编译单元的多个代码行之间。例如,该程序代码位于varjs=‘begin’的下一行,或者在varjs=‘end’的前一行。

在另一些实施例中,在编译单元被执行的时候,会位于线程的栈顶,则统计模块可以监测线程的栈顶,统计该编译单元位于线程的栈顶的次数,进而统计得到编译单元的被执行次数。

s203:根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码。

可以基于预先设定的规则,根据代码数量和被执行次数,确定编译单元是否为热点代码。

其中,预先设定的规则可以是,代码数量和被执行次数之和,与预设数值的比对,根据比对结果判断编译单元是否为热点代码。例如,如果上述得到的之和的结果,大于预设数值,则判定编译单元是热点代码,如果,上述得到的之和的结果小于或等于预设数值,则判定编译单元不是热点代码。其中,预设数值可以预先设定的,例如,该预设数值可以是系统默认的方式判定编译单元是否为热点代码时所使用的。例如,默认的判定热点代码的方式为,获取编译单元的被执行的次数,与预设数值比对,如果大于该预设数值,则判定编译单元为热点代码,如果小于或等于预设数值,则判定编译单元不是热点代码。

于本申请实施例中,代码数量和被执行次数之和大于该预设数值的时候,可以判定编译单元为热点代码,因此,即使被执行次数不足,由于编译单元的代码数量比较大的情况下,依然可以使得该编译单元被判定为热点。

当然,还可以将代码数量和被执行次数之乘积,与预设数值比对,以便在被执行次数不足的时候,代码数量能够增大该乘积的数值。当然,该预设数值也可以不是默认的判定热点代码时所使用的数值而是另外设置的数值,具体地,可以根据实际使用的需求而设定,在此不做限定。于本申请实施例中,使用代码数量和被执行次数之和的方式,判断编译单元是否为热点代码,具体地,请参考后续实施例。

s204:若所述编译单元为热点代码,则执行预设操作。

其中,所述预设操作可以是根据该热点代码生成配置文件。

其中,配置文件用于记录所述指定应用程序的热点代码标识,该配置文件可以是profile文件。该profile文件为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,而正是由jit编译器负责这项任务。

简单而言,profile文件记录了应用频繁运行的方法或者代码块,经由jit或者aot编译后得到.odex/.oat文件,该文件存有这些热点代码编译而成的二进制机器码,可直接交由底层cpu执行,从而提高了运行速度。

作为一种实施方式,电子设备将所生成的配置文件发送至服务器,服务器将该profile文件与该应用程序的应用标识对应存储,以便记录该应用程序的profile文件。作为一种实施方式,该profile文件同时与应用程序的应用标识以及用户帐号对应存储,以便服务器能够记录用户帐号对应的用户在操作应用标识对应的应用程序时所产生的profile文件。

服务器能够收集不同的用户终端上传的针对不同的应用程序的不同的profile文件,服务器能够将同一个应用程序对应的不同的profile文件整理成一个通用的profile文件,作为与该应用程序对应的profile文件。从而,在新的用户由服务器下载该应用程序的时候,服务器能够将该应用程序的安装文件和profile文件一起发送至用户终端,用户终端在安装该应用程序的时候,在安装应用过程中,调用dex2oat对热点代码进行编译,从而提升应用安装后的性能。

作为另一种实施方式,该预设操作还可以是将该热点代码生成机器码,这样做之后,在程序执行的时候,就可以直接使用已经编译好的机器码以加快效率。

请参阅图3,本申请实施例提供了一种代码处理方法,如图3所示,该方法包括:s301至s306。

s301:获取编译单元的代码数量。

s302:获取编译单元的被执行次数。

s303:获取所述代码数量与预设数量阈值之间的第一差值。

其中,预先设置一个预设数量阈值,该预设数量阈值可以是预先设定的一个代码数量,如果编译单元的代码数量大于该预设数量阈值,则表示编译单元属于体量较大的编译单元,而如果编译单元的代码数量小于或等于该预设数量阈值,则表示编译单元属于体量较小的编译单元。

其中,预设数量阈值可以是根据经验而设定的,也可以是根据电子设备的运行参数而设定的,还可以是根据该编译代码的应用场景而设定,具体地,请参阅后续实施例。

s304:获取所述被执行次数与预设次数阈值之间的第二差值。

其中,预先设置一个预设次数阈值,该预设次数阈值可以是预先设定的一个被执行次数,如果编译单元的被执行次数大于该预设次数阈值,则表示编译单元属于被执行次数较多的编译单元,而如果编译单元的被执行次数小于或等于该预设次数阈值,则表示编译单元属于被执行次数较少的编译单元。

其中,预设次数阈值可以是根据经验而设定的,也可以是根据电子设备的运行参数而设定的,还可以是根据该编译代码的应用场景而设定,具体地,请参阅后续实施例。

s305:根据所述第一差值和所述第二差值,确定所述编译单元是否为热点代码。

作为一种实施方式,获取第一差值和第二差值之和,记为待判定结果,判断所述判定结果是否大于指定数值,如果判定结果大于指定数值,则判定该编译单元为热点代码,如果判定结果小于或等于指定数值,则判定编译单元不是热点代码。

由于判定结果为第一差值和第二差值之和,则在被执行次数较少的时候,能够通过编译代码的代码数量使得该判定结果的数值增大,从而,使得代码数量较多的编译单元在被执行次数较少的时候,依然能够有较大的可能性被判定为热点代码。

当然,还可以是获取第一差值和第二差值的乘积作为上述判定结果。

作为一种实施方式,可以为第一差值设定一个权重,以及为第二差值设定一个权重,在确定热点代码的时候,结合第一权重和第二权重共同确定。则根据所述第一差值和所述第二差值,确定所述编译单元是否为热点代码的具体实施方式可以是,根据所述第一差值、所述第一差值对应的第一权重、所述第二差值以及所述第二差值对应的第二权重,获取热点代码评估值;若所述热点代码评估值大于指定评估值,则判定所述编译单元为热点代码。

其中,第一权重和第二权重可以是预先设定的数值,起到调节第一差值和第二差值的作用,同时也反映了第一差值和第二差值在用于确定编译单元是否为热点代码的时候,所占的比重。例如,第一权重越大,表示第一差值所占的比重越高,而第二权重越大,表示第二差值所占的比重越高。

作为一种实施方式,根据所述第一差值、所述第一差值对应的第一权重、所述第二差值以及所述第二差值对应的第二权重获取热点代码评估值的实施方式可以是,获取第一差值和第一权重的乘积,作为第一乘积结果,获取第二差值和第二权重的乘积,作为第二乘积结果,获取第一乘积结果和第二乘积结果之和作为热点代码评估值。具体地,可以根据以下方式获取热点代码评估值:

s_hot=y_cln*cvw y_cen*cew;

其中,s_hot为热点代码评估值,y_cln为所述第一差值,cvw为所述第一权重,y_cen为所述第二差值,cew为所述第二权重。

具体地,设定代码数量为cln,预设数量阈值为clnt,被执行次数cen,预设次数阈值为cent,则第一差值为:y_cln=cln-clnt,当前的编译单元的代码数量,即当前编译单元的代码行数减去预设数量阈值的差值(y_cln)与编译单元的代码数量成正相关,即当前的编译单元的代码数量越大,第一差值的值越大,当前的编译单元的代码数量越小,第一差值的值越小。

第二差值为:y_cen=cen-cent,当前代码执行次数减去预设次数阈值的差值(y_cen)与代码热度成正相关,其中,编译单元的被执行次数能够表示其热度,即编译单元的被执行次数越高,表示该编译单元的热度越高。

得到的热点代码评估值用于表示该编译单元被判定为热点代码的趋势,热点代码评估值越大,则表示该编译单元越有可能被判定为热点代码,而热点代码评估值越小,则表示该编译单元越有可能被判定为非热点代码。

因此,设定一个热点代码评估值,判断热点代码评估值是否大于指定评估值,如果热点代码评估值大于指定评估值,则判定所述编译单元为热点代码,如果热点代码评估值小于或等于指定评估值,则判定所述编译单元为非热点代码。例如,设定指定评估值为cht,则比较s_hot和cht。若s_hot>cht,则认定编译单元为热点代码。

因此,如果编译单元的被执行的次数比较少,但是,编译单元的代码数量比较大的时候,虽然,y_cen*cew数值比较小,但是,y_cln*cvw数值比较大,则s_hot的数值依然比较大,则依然有可能使得热点代码评估值大于指定评估值,从而被判定为热点代码。

例如,上述图1所示,代码a的代码数量为100行,代码b的代码数量为10行,代码a被执行5次,代码b被执行20次,则在次数阈值为15的时候,代码a为非热点代码。那么,假设代码数量阈值为30,预设次数阈值为10,则第一差值为70行,第二差值为-5,则第一权重为0.5,第二权重为0.5,则热点代码评估值为32.5,即s_hot=70*0.5-5*0.5=32.5,而32.5大于15,即代码a可以被判定为热点代码。

其中,预设数量阈值和预设次数阈值根据所述电子设备的设备信息和编译单元的应用场景而设定,下面将分别以设备信息和编译单元的应用场景评述预设数量阈值和预设次数阈值的设定。

作为一种实施方式,编译单元在电子设备内运行,所述预设数量阈值和预设次数阈值根据所述电子设备的设备信息而设定。其中,该设备信息可以是电子设备的中央处理器的使用率,还可以是内存信息。

其中,中央处理器的使用率可以通过查看电子设备的任务管理器而获取,例如,在安卓系统下,通过adbshelltop指令获取cpu的使用率。则作为一种实施方式,中央处理器的使用率越大,则所述预设数量阈值和预设次数阈值越小,从而可以减少热点代码评估值,进而可以得到应用程序内的更多的热点代码,以便在执行该应用程序的时候,应用程序能够得到更快的执行速度,避免在中央处理器的使用率不高的时候,应用程序的执行速度过慢。

作为另一种实施方式,内存信息包括内存容量,所述内存容量越大,所述预设数量阈值和预设次数阈值越小。其中,内存容量可以是电子设备的最大内存大小,也可以是电子设备当前的剩余内容空间,于本申请实施例中,将电子设备当前的剩余内容空间作为电子设备的内存容量。则电子设备当前的剩余内容空间越大,预设数量阈值和预设次数阈值越小,从而可以减少热点代码评估值,进而可以得到应用程序内的更多的热点代码,以便在执行该应用程序的时候,应用程序能够得到更快的执行速度。另外,由于内存容量比较大,有更多的存储空间可以存储热点代码,从而能够避免热点代码过多而导致电子设备的内存空间不足。

则在一些实施例中,可以预先设定内存空间级别,以及设定一个基准的预设数量阈值,定义为第一基准值,并且设定一个预设次数阈值的基准值,作为第二基准值。其中,内存空间级别可以是按照电子设备的内存最大值划分多个内存级别,例如,一共划分10个内存级别,如0-10%为内存级别1,10%-20%为内存级别2,以此类推,最高内存级别为内存级别10。例如,第一基准值对应内存级别5,第二基准值对应内存级别5,而每增加一个内存级别,将该第一基准值减小一个常数值c,且第二基准值减小一个常数值d,即内存级别6对应的预设数量阈值为第一基准值减c,内存级别6对应的预设次数阈值为第二基准值减d,而内存级别7对应的预设数量阈值为第一基准值减2c,预设次数阈值为第二基准值减2d。在内存级别5每降低一个内存级别,则该第一基准值增加一个常数值c,该第二基准值增加一个常数值d,即内存级别4对应的预设数量阈值为第一基准值加c,内存级别4对应的预设次数阈值为第二基准值加d,内存级别3对应的预设数量阈值为第一基准值加2c,内存级别3对应的预设次数阈值为第二基准值加2d,以此类推。因此,内存容量越大,所述预设次数阈值和预设次数阈值越小,内存容量越小,所述预设次数阈值和预设次数阈值越大。

作为另一种实施方式,所述预设数量阈值和预设次数阈值根据所述编译单元的应用场景而设定。

其中,编辑单元的应用场景,可以是编译单元对应的应用程序的应用类型。具体地,获取编译单元对应的应用程序,然后,获取该应用程序的应用类型,该应用类型作为该编译单元的应用场景。

应用程序的应用类型,可以是应用程序的开发商在开发的时候为应用程序设定的应用类型,也可以是应用程序在安装在电子设备上之后,用户为应用程序设定的应用类型,例如,用户在电子设备上安装某个应用程序,在安装完成并进入该应用程序之后,会显示一个对话框,指示用户为应用程序设定应用类型。则应用程序具体属于哪个应用类型,可以由用户根据需求而设定,例如,用户可以将某社交软件设置为音频类,或者设置为视频类,或者设置为社交类。

另外,电子设备内安装有应用程序安装软件,例如ios系统内的appstore。则在该应用程序安装软件内设置有应用程序列表,在该列表内用户能够下载应用程序并且能够更新和打开应用程序,而且该应用程序安装软件可以将不同的应用程序按照应用类型现实,比如,音频类、视频类或者游戏类等。因此,用户在使用该应用程序安装软件安装应用程序的时候,就已经能够知道该应用程序的应用类型。

另外,考虑到有些应用程序可以播放视频也可以播放音频,则如果该应用程序支持视频播放的功能,就将该应用程序的类型设置为视频类型,如果不支持视频播放的功能,而仅仅支持音频播放的功能,则就将该应用程序的类型设置为音频类型。而具体地,应用程序是否支持视频播放功能,可以通过该应用程序的功能描述信息中,所包含的功能描述,例如,所支持的播放格式来判断是否支持视频格式的播放,也可以通过检测该应用程序的程序模块内是否播放视频播放模块,例如,某个视频播放的编解码算法等,从而能够确定该应用程序是否支持视频播放功能。

再者,如果有些应用程序的功能多样化,则需要根据应用程序的具体操作行为而确定该应用程序的应用类型,例如,如果有些应用程序能够播放视频,也能够播放音频,例如一些视频播放软件,可以播放纯音频文件,也可以播放视频,则该应用程序的应用类型可以根据应用程序的使用记录而确定,即根据该应用程序的一定时间段内的使用记录,确定用户使用该应用程序是倾向于播放视频还是更倾向于播放音频。

具体地,获取该应用程序在预设时间段内的所有用户的操作行为数据,其中,所有用户是指安装过该应用程序的所有用户,则该操作行为数据可以由应用程序对应的服务器内获取,也就是说,用户在使用该应用程序的时候会使用用户对应的用户账号登录该应用程序,而用户账号对应的操作行为数据会发送至应用程序对应的服务器,则服务器将所获取的操作行为数据与用户账号对应存储。在一些实施例中,电子设备发送针对应用程序的操作行为查询请求发送至该应用程序对应的服务器,服务器将一定预设时间段内的所有用户的操作行为数据发送至电子设备。

该操作行为数据包括所播放的音频文件的名称和时间、以及所播放的视频文件的名称和时间,通过分析该操作行为数据就能够确定在一定预设时间段内该应用程序播放的音频文件的数量以及总的时间,也可以得到该应用程序播放的视频文件的数量以及总的时间,则根据音频和视频文件的播放总时长在该预定时间段内的占比,确定应用程序的应用类型,具体地,获取音频和视频文件的播放总时长在该预定时间段内的占比,为方便描述,将音频文件的播放总时长在该预定时间段内的占比记为音频播放占比,将视频文件的播放总时长在该预定时间段内的占比记为视频播放占比,如果视频播放占比大于音频播放占比,则将应用程序的应用类型设定为视频类型,如果音频播放占比大于视频播放占比,则将应用程序的应用类型设定为音频类型。例如,预设时间段为30天,即720小时,而音频文件的播放总时长为200小时,则音频播放占比为27.8%,视频文件的播放总时长为330小时,则视频播放占比为45.8%,则视频播放占比大于音频播放占比,则将应用程序的应用类型设定为视频类型。

作为另一种实施方式,电子设备内的应用程序的uid是由一串数字构成的,且该数字的排列存在一定的规律性,不同的应用类型的应用程序的uid所对应的数字分段区域是不同的,例如,uid为00000至09999的应用程序同属于一个应用类型,因此,根据该应用程序的uid能够确定该应用程序对应的应用类型。

另外,该编译单元的应用场景还可以是该编译单元的功能,具体地,可以是该编译单元的开发人员在开发该编译单元的时候,编辑该编译单元的功能描述内容,然后,在该编译单元被执行的时候,读取该功能描述内容能够确定该编译单元的功能,作为该编译单元的应用场景。

再者,编译单元可以被应用程序调用而执行,则确定调用该编译单元的应用程序,作为目标应用程序,确定该目标应用程序的应用类型,作为该编译单元的应用场景。

确定该应用场景的执行速度,具体地,预先设置多个执行速度级别。作为一种实施方式,每个执行速度级别对应至少一个应用场景,下面,以上述的应用场景为应用类别为例。例如,该执行速度级别包括执行速度级别1、执行速度级别2、、、、执行速度级别10。则可以预先设定一个预设次数阈值的基准值,作为第二基准值。

例如,第一基准值对应执行速度级别5,第二基准值对应执行速度级别5,而每增加一个执行速度级别,将该第一基准值减小一个常数值c,且第二基准值减小一个常数值d,即执行速度级别6对应的预设数量阈值为第一基准值减c,执行速度级别6对应的预设次数阈值为第二基准值减d,而执行速度级别7对应的预设数量阈值为第一基准值减2c,预设次数阈值为第二基准值减2d。在执行速度级别5每降低一个执行速度级别,则该第一基准值增加一个常数值c,该第二基准值增加一个常数值d,即执行速度级别4对应的预设数量阈值为第一基准值加c,执行速度级别4对应的预设次数阈值为第二基准值加d,执行速度级别3对应的预设数量阈值为第一基准值加2c,执行速度级别3对应的预设次数阈值为第二基准值加2d,以此类推。因此,应用场景的执行速度越快,则预设次数阈值和预设次数阈值越小。

因此,确定该编译单元对应的应用类别,确定该应用类别所属的执行速度级别,根据上述预先设定的执行速度级别对应的预设数量阈值和预设次数阈值,确定该应用场景的执行速度对应的预设次数阈值和预设次数阈值。其中,应用场景的执行速度可以是该编译单元运行时,所需求的执行速度,具体地,可以是编译单元对应的应用程序或者功能模块的执行速度。例如,该编译单元对应的功能是node.js服务器,或者该编译单元对应的应用程序的类别是node.js服务器能,javascript引擎商可以将clnt和cent的值给小,生成相对多的热点代码,加快执行速度。

再者,确定该应用场景的启动速度,具体地,预先设置多个启动速度级别。作为一种实施方式,每个启动速度级别对应至少一个应用场景,下面,以上述的应用场景为应用类别为例。例如,该启动速度级别包括启动速度级别1、启动速度级别2、、、、启动速度级别10。则可以预先设定一个预设次数阈值的基准值,作为第三基准值。

例如,第一基准值对应启动速度级别5,第三基准值对应启动速度级别5,而每增加一个启动速度级别,将该第一基准值增加一个常数值c,且第三基准值增加一个常数值e,即启动速度级别6对应的预设数量阈值为第一基准值加c,启动速度级别6对应的预设次数阈值为第三基准值加e,而启动速度级别7对应的预设数量阈值为第一基准值加2c,预设次数阈值为第三基准值加2e。在启动速度级别5每降低一个启动速度级别,则该第一基准值减去一个常数值c,该第三基准值减去一个常数值e,即启动速度级别4对应的预设数量阈值为第一基准值减c,启动速度级别4对应的预设次数阈值为第三基准值减e,启动速度级别3对应的预设数量阈值为第一基准值减2c,启动速度级别3对应的预设次数阈值为第三基准值减2e,以此类推。因此,应用场景的启动速度越快,则预设次数阈值和预设次数阈值越大。其中,应用场景的启动速度可以是该编译单元运行时,所需求的启动速度,具体地,可以是编译单元对应的应用程序或者功能模块的启动速度。例如,该编译单元对应的功能是网页搜索,或者该编译单元对应的应用程序的类别是搜索功能,javascript引擎商可以将clnt和cent的值给大,生成相对少的热点代码,减少字节码到机器码的编译时间消耗,快速启动。

s306:若所述编译单元为热点代码,则执行预设操作。

需要说明的是,上述步骤未详细描述的部分,可以参考前述实施例,在此不再赘述。

请参阅图4,其示出了本申请实施例提供的一种代码处理装置400的结构框图。该装置可以包括:第一获取模块401、第二获取模块402、确定模块403和执行模块404。

第一获取模块401,用于获取编译单元的代码数量。

第二获取模块402,用于获取编译单元的被执行次数。

确定模块403,用于根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码。

执行模块404,用于若所述编译单元为热点代码,则执行预设操作。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述装置和模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

请参阅图5,其示出了本申请实施例提供的一种代码处理装置500的结构框图。该装置可以包括:第一获取模块510、第二获取模块520、确定模块530和执行模块540。

第一获取模块510,用于获取编译单元的代码数量。

第二获取模块520,用于获取编译单元的被执行次数。

确定模块530,用于根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码。

进一步地,确定模块包括第一差值获取子模块531、第二差值获取子模块532和确定子模块533。

第一差值获取子模块531用于获取所述代码数量与预设数量阈值之间的第一差值。

第二差值获取子模块532用于获取所述被执行次数与预设次数阈值之间的第二差值。

确定子模块533用于根据所述第一差值和所述第二差值,确定所述编译单元是否为热点代码。

进一步,确定子模块533还用于根据所述第一差值、所述第一差值对应的第一权重、所述第二差值以及所述第二差值对应的第二权重,获取热点代码评估值;若所述热点代码评估值大于指定评估值,则判定所述编译单元为热点代码。

进一步,确定子模块533还用于根据以下方式获取热点代码评估值:

s_hot=y_cln*cvw y_cen*cew;

其中,s_hot为热点代码评估值,y_cln为所述第一差值,cvw为所述第一权重,y_cen为所述第二差值,cew为所述第二权重。

其中,所述编译单元在电子设备内运行,所述预设数量阈值和预设次数阈值根据所述电子设备的内存信息而设定。所述内存信息包括内存容量,所述内存容量越大,所述预设数量阈值和预设次数阈值越小。

另外,所述预设数量阈值和预设次数阈值根据所述编译单元的应用场景而设定。所述应用场景的执行速度越快,则预设数量阈值和预设次数阈值越小。所述应用场景的启动速度越快,则预设数量阈值和预设次数阈值越大。

执行模块540,用于若所述编译单元为热点代码,则执行预设操作。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述装置和模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,模块相互之间的耦合可以是电性,机械或其它形式的耦合。

另外,在本申请各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。

请参考图6,其示出了本申请实施例提供的一种电子设备的结构框图。该电子设备100可以是智能手机、平板电脑、电子书等能够运行应用程序的电子设备。本申请中的电子设备100可以包括一个或多个如下部件:处理器110、存储器120、以及一个或多个应用程序,其中一个或多个应用程序可以被存储在存储器120中并被配置为由一个或多个处理器110执行,一个或多个程序配置用于执行如前述方法实施例所描述的方法。

处理器110可以包括一个或者多个处理核。处理器110利用各种接口和线路连接整个电子设备100内的各个部分,通过运行或执行存储在存储器120内的指令、程序、代码集或指令集,以及调用存储在存储器120内的数据,执行电子设备100的各种功能和处理数据。可选地,处理器110可以采用数字信号处理(digitalsignalprocessing,dsp)、现场可编程门阵列(field-programmablegatearray,fpga)、可编程逻辑阵列(programmablelogicarray,pla)中的至少一种硬件形式来实现。处理器110可集成中央处理器(centralprocessingunit,cpu)、图像处理器(graphicsprocessingunit,gpu)和调制解调器等中的一种或几种的组合。其中,cpu主要处理操作系统、用户界面和应用程序等;gpu用于负责显示内容的渲染和绘制;调制解调器用于处理无线通信。可以理解的是,上述调制解调器也可以不集成到处理器110中,单独通过一块通信芯片进行实现。

存储器120可以包括随机存储器(randomaccessmemory,ram),也可以包括只读存储器(read-onlymemory)。存储器120可用于存储指令、程序、代码、代码集或指令集。存储器120可包括存储程序区和存储数据区,其中,存储程序区可存储用于实现操作系统的指令、用于实现至少一个功能的指令(比如触控功能、声音播放功能、图像播放功能等)、用于实现下述各个方法实施例的指令等。存储数据区还可以存储终端100在使用中所创建的数据(比如电话本、音视频数据、聊天记录数据)等。

请参考图7,其示出了本申请实施例提供的一种计算机可读存储介质的结构框图。该计算机可读介质700中存储有程序代码,所述程序代码可被处理器调用执行上述方法实施例中所描述的方法。

计算机可读存储介质700可以是诸如闪存、eeprom(电可擦除可编程只读存储器)、eprom、硬盘或者rom之类的电子存储器。可选地,计算机可读存储介质700包括非易失性计算机可读介质(non-transitorycomputer-readablestoragemedium)。计算机可读存储介质700具有执行上述方法中的任何方法步骤的程序代码710的存储空间。这些程序代码可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。程序代码710可以例如以适当形式进行压缩。

综上所述,本申请实施例提供的代码处理方法、装置、电子设备及计算机可读介质,分别获取编译单元的代码数量和被执行次数,并且根据代码数量和所述被执行次数,确定所述编译单元是否为热点代码,在确定编译单元为热点代码的情况下,执行预设操作。因此,基于编译单元的代码数量和被执行次数来确定编译单元是否为热点代码,相比仅根据执行次数来确定热点代码而言,使得判断维度更加丰富,使得热点代码的确定更加准确。

因此,通过引进指标“代码体量”,涵盖以往的热点代码判定盲区,将更多有价值的代码块编译成机器码,加快javascript源代码的运行速度。通过控制指标“代码体量阀值”和“代码执行次数阀值”大小,在各种运行场景中,灵活选择生成热点代码的多少,以满足不同场景对启动速度或执行速度的需求。

另外,上述方法不仅适用于javascript引擎,在jvm(java虚拟机)中引入指标“代码体量”(即代码数量)也同样适用。和javascript类似,在java中,当代码块运行达到一定次数之后,jvm会将代码块从字节码编译成机器码,从而加快执行速度。通过在jvm中引入“代码体量”,更多有价值的代码块会被判定为热点代码,加快java源码的执行速度。

最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不驱使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。


技术特征:

1.一种代码处理方法,其特征在于,包括:

获取编译单元的代码数量;

获取编译单元的被执行次数;

根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码;

若所述编译单元为热点代码,则执行预设操作。

2.根据权利要求1所述的方法,其特征在于,所述根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码,包括:

获取所述代码数量与预设数量阈值之间的第一差值;

获取所述被执行次数与预设次数阈值之间的第二差值;

根据所述第一差值和所述第二差值,确定所述编译单元是否为热点代码。

3.根据权利要求2所述的方法,其特征在于,所述根据所述第一差值和所述第二差值,确定所述编译单元是否为热点代码,包括:

根据所述第一差值、所述第一差值对应的第一权重、所述第二差值以及所述第二差值对应的第二权重,获取热点代码评估值;

若所述热点代码评估值大于指定评估值,则判定所述编译单元为热点代码。

4.根据权利要求3所述的方法,其特征在于,所述根据所述第一差值、所述第一差值对应的第一权重、所述第二差值以及所述第二差值对应的第二权重,获取热点代码评估值,包括:

根据以下方式获取热点代码评估值:

s_hot=y_cln*cvw y_cen*cew;

其中,s_hot为热点代码评估值,y_cln为所述第一差值,cvw为所述第一权重,y_cen为所述第二差值,cew为所述第二权重。

5.根据权利要求2所述的方法,其特征在于,所述编译单元在电子设备内运行,所述预设数量阈值和预设次数阈值根据所述电子设备的内存信息而设定。

6.根据权利要求5所述的方法,其特征在于,所述内存信息包括内存容量,所述内存容量越大,所述预设数量阈值和预设次数阈值越小。

7.根据权利要求2所述的方法,其特征在于,所述预设数量阈值和预设次数阈值根据所述编译单元的应用场景而设定。

8.根据权利要求7所述的方法,其特征在于,所述应用场景的执行速度越快,则预设数量阈值和预设次数阈值越小。

9.根据权利要求7所述的方法,其特征在于,所述应用场景的启动速度越快,则预设数量阈值和预设次数阈值越大。

10.一种代码处理装置,其特征在于,包括:

第一获取模块,用于获取编译单元的代码数量;

第二获取模块,用于获取编译单元的被执行次数;

确定模块,用于根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码;

执行模块,用于若所述编译单元为热点代码,则执行预设操作。

11.一种电子设备,其特征在于,包括:

一个或多个处理器;

存储器;

一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于执行如权利要求1-9任一项所述的方法。

12.一种计算机可读介质,其特征在于,所述计算机可读介质存储有处理器可执行的程序代码,所述程序代码被所述处理器执行时使所述处理器执行权利要求1-9任一项所述方法。

技术总结
本申请公开了一种代码处理方法、装置、电子设备及计算机可读介质,涉及计算机技术领域。该方法包括:获取编译单元的代码数量;获取编译单元的被执行次数;根据所述代码数量和所述被执行次数,确定所述编译单元是否为热点代码;若所述编译单元为热点代码,则执行预设操作。因此,基于编译单元的代码数量和被执行次数来确定编译单元是否为热点代码,相比仅根据执行次数来确定热点代码而言,使得判断维度更加丰富,使得热点代码的确定更加准确。

技术研发人员:郭静
受保护的技术使用者:OPPO(重庆)智能科技有限公司
技术研发日:2020.01.16
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-29751.html

最新回复(0)