代码编译时长确定方法、装置、电子设备和存储介质
文献发布时间:2023-06-19 12:16:29
技术领域
本公开涉及数据处理技术领域,尤其涉及代码编译时长确定方法、装置、电子设备和存储介质。
背景技术
在相关技术中,某些代码,例如C++代码,存在编译速度过慢的问题。而代码中一种包含多个源码文件,相关技术中可以通过一些工具,例如cmake工具确定编译每个源码文件的编译时长,从而使得用户可以根据编译时长确定哪个源码文件导致代码整体编译时长过长。
但是目前的方式仅能以源码文件为粒度确定出编译时长,但是并不足以使得用户准确地确定具体是源码文件中哪部分代码导致码整体编译时长过长。
发明内容
本公开提供了代码编译时长确定方法、装置、电子设备和存储介质,以至少解决相关技术中的技术问题。本公开的技术方案如下:
根据本公开实施例的第一方面,提出一种代码编译时长确定方法,包括:
在待编译代码中设置n个注释标签,n>1;
获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码,1≤i<j≤n;
对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长;
根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长。
可选地,所述待编译代码包含m个源码文件,每个所述源码文件包括本地代码,其中,m≥1,在待编译代码中设置n个注释标签之前,所述方法还包括:
在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件;
其中,所述在待编译代码中设置n个注释标签包括:
在所述目标源码文件的本地代码中设置所述n个注释标签。
可选地,每个所述源码文件还包括头文件,所述在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件包括:
对所述m个源码文件中第p个源码文件和所述第p个源码文件中的头文件分别进行编译,获取编译所述第p个源码文件的第p源码文件时长,以及编译所述第p个源码文件中的头文件的第p头文件时长,其中,1≤p≤m;
计算所述第p源码文件时长与所述第p头文件时长的第p差值时长;
确定m个所述源码文件对应的m个差值时长中,大于所述预设时长阈值的目标差值时长对应的目标源码文件。
可选地,在获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码之前,所述方法还包括:
指定编译程序为预设代理程序;
其中,所述预设代理程序中至少包含第一命令、第二命令和第三命令,其中,所述第一命令用于获取所述待编译代码中的每部分代码,所述第二命令用于调用所述编译程序进行至少一次编译操作,所述第三命令用于获取每次编译操作的时长;
运行所述预设代理程序。
可选地,所述对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长包括:
对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码得到第一中间文件的第一中间文件时长,以及编译所述第二部分代码得到第二中间文件的第二中间文件时长;
获取根据所述第一中间文件生成第一可执行文件的第一可执行文件时长,以及根据所述第二中间文件生成第二可执行文件的第二可执行文件时长;
在根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长之后,所述方法还包括:
根据所述第二中间文件时长和所述第一中间文件时长的差值,确定编译所述目标代码得到目标中间文件的目标中间文件时长,以及根据所述第二可执行文件时长和所述第一可执行文件时长的差值,确定根据所述目标中间文件生成目标可执行文件的目标可执行文件时长;
根据所述目标代码、所述目标中间文件和所述目标可执行文件之间的依赖关系,以及所述目标中间文件时长和所述目标可执行文件时长生成图像。
根据本公开实施例的第二方面,提出一种代码编译时长确定装置,包括:
标签设置模块,被配置为执行在待编译代码中设置n个注释标签,n>1;
代码获取模块,被配置为执行获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码,1≤i<j≤n;
代码编译模块,被配置为执行对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长;
时长确定模块,被配置为执行根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长。
可选地,所述待编译代码包含m个源码文件,每个所述源码文件包括本地代码,其中,m≥1,在待编译代码中设置n个注释标签之前,所述装置还包括:
文件确定模块,被配置为执行在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件;
其中,所述标签设置模块,被配置为执行在所述目标源码文件的本地代码中设置所述n个注释标签。
可选地,每个所述源码文件还包括头文件,所述文件确定模块包括:
编译子模块,被配置为执行对所述m个源码文件中第p个源码文件和所述第p个源码文件中的头文件分别进行编译,获取编译所述第p个源码文件的第p源码文件时长,以及编译所述第p个源码文件中的头文件的第p头文件时长,其中,1≤p≤m;
计算子模块,被配置为执行计算所述第p源码文件时长与所述第p头文件时长的第p差值时长;
确定子模块,被配置为执行确定m个所述源码文件对应的m个差值时长中,大于所述预设时长阈值的目标差值时长对应的目标源码文件。
可选地,所述装置还包括:
程序执行模块,被配置为执行指定编译程序为预设代理程序;
其中,所述预设代理程序中至少包含第一命令、第二命令和第三命令,其中,所述第一命令用于获取所述待编译代码中的每部分代码,所述第二命令用于调用所述编译程序进行至少一次编译操作,所述第三命令用于获取每次编译操作的时长;
程序运行模块,被配置为执行运行所述预设代理程序。
可选地,所述代码编译模块,被配置为执行对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码得到第一中间文件的第一中间文件时长,以及编译所述第二部分代码得到第二中间文件的第二中间文件时长;以及获取根据所述第一中间文件生成第一可执行文件的第一可执行文件时长,以及根据所述第二中间文件生成第二可执行文件的第二可执行文件时长;
所述时长确定模块,还被配置为执行根据所述第二中间文件时长和所述第一中间文件时长的差值,确定编译所述目标代码得到目标中间文件的目标中间文件时长,以及根据所述第二可执行文件时长和所述第一可执行文件时长的差值,确定根据所述目标中间文件生成目标可执行文件的目标可执行文件时长;
所述装置还包括:
图像生成模块,根据所述目标代码、所述目标中间文件和所述目标可执行文件之间的依赖关系,以及所述目标中间文件时长和所述目标可执行文件时长生成图像。
根据本公开实施例的第三方面,提出一种电子设备,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如上述任一实施例所述的代码编译时长确定方法。
根据本公开实施例的第四方面,提出一种存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行上述任一实施例所述的代码编译时长确定方法。
根据本公开实施例的第五方面,提供一种计算机程序产品,所述计算机程序产品被配置为执行上述任一实施例所述的代码编译时长确定方法。
根据本公开的实施例,通过在待编译代码中设置注释标签,可以在编译代码的过程中确定编译任意两个注释标签之间代码所需的时长,使得用户可以准确地确定对源码文件任意部分代码进行编译所需的编译时长,以便对相应部分代码进行调整,缩短对源码文件整体的编译时长。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是根据本公开的实施例示出的一种代码编译时长确定方法的示意流程图。
图2是根据本公开的实施例示出的另一种代码编译时长确定方法的示意流程图。
图3是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。
图4是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。
图5是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。
图6是根据本公开的实施例示出的一种火焰图的示意图。
图7是根据本公开的实施例示出的编译源码文件所需时长的示意图。
图8是根据本公开的实施例示出的编译本地代码所需时长的示意图。
图9是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。
图10是根据本公开的实施例示出的一种代码编译时长确定装置的示意框图。
图11是根据本公开的实施例示出的另一种代码编译时长确定装置的示意框图。
图12是根据本公开的实施例示出的一种文件确定模块的示意框图。
图13是根据本公开的实施例示出的又一种代码编译时长确定装置的示意框图。
图14是根据本公开的实施例示出的又一种代码编译时长确定装置的示意框图。
图15是根据本公开的实施例示出的代码编译时长确定装置所在设备的一种硬件结构图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
图1是根据本公开的实施例示出的一种代码编译时长确定方法的示意流程图。本实施例所述的方法可以适用于能够编译代码的电子设备,所述电子设备可以是终端,也可以是服务器,所述终端包括但不限于手机、平板电脑、可穿戴设备、个人计算机等。
如图1所示,所述代码编译时长确定方法可以包括以下步骤:
在步骤S101中,在待编译代码中设置n个注释标签,n>1;所述待编译代码可以是C++代码,也可以是其他代码,例如java代码。
在步骤S102中,获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码,1≤i<j≤n;
在步骤S103中,对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长;
在步骤S104中,根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长。
在一个实施例中,用户(例如代码编写人员)可以在待编译代码中设置n个注释标签,所述注释标签的形式可以根据需要设定。
通过设置注释标签,在使用编译程序对代码编译过程中,可以基于注释标签进行操作,例如可以获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码,然后对所述第一部分代码和所述第二部分代码分别进行编译。
例如将全部待编译代码复制到一个空文件中,然后删除第i个注释标签之后的代码删除,从而文件中仅保留有第i个注释标签之前的第一部分代码,进而可以对文件进行编译,编译时长即第一部分时长;类似地,可以全部待编译代码复制到一个空文件中,然后删除第j个注释标签之后的代码删除,从而文件中仅保留有第j个注释标签之前的第二部分代码,进而可以对文件进行编译,编译时长即第二部分时长。
其中,可以通过特定的命令,例如linux time命令获取编译程序编译编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长,而第二部分代码相对于第一部分代码多出的部分代码,就是第i个注释标签到所述j个注释标签之间的代码,那么第二部分时长和第一部分时长的差值,就是编译第i个注释标签到所述j个注释标签之间代码的时长。
例如从待编译代码中获取的某段代码如下:
用户可以根据需要在上述代码中添加注释标签,其中,注释标签的形式可以根据需要设定,例如注释标签的形式为//GCC_PROFILER(也可以根据需要设置为其他形式,例如/*GCC_PROFILER*/),那么在上述代码中添加注释标签后如下所示:
由于从待编译的代码中获取到的代码并不是完整的代码,对其进行直接编译可能会出现编译失败的问题,所以可以获取到的代码中添加补全代码,例如上述代码中的#endif。
据此,在对上述添加了注释标签的代码进行编译时,可以确定对应任意两个注释标签//GCC_PROFILER之间的代码进行编译所需的时长。
根据本公开的实施例,通过在待编译代码中设置注释标签,可以在编译代码的过程中确定编译任意两个注释标签之间代码所需的时长,使得用户可以准确地确定对源码文件任意部分代码进行编译所需的编译时长,以便对相应部分代码进行调整,缩短对源码文件整体的编译时长。
图2是根据本公开的实施例示出的另一种代码编译时长确定方法的示意流程图。如图2所示,所述待编译代码包含m个源码文件,每个所述源码文件包括本地代码,其中,m≥1,在待编译代码中设置n个注释标签之前,所述方法还包括:
在步骤S105中,在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件;
其中,所述在待编译代码中设置n个注释标签包括:
在步骤S1011中,在所述目标源码文件的本地代码中设置所述n个注释标签。
在一个实施例中,在待编译代码中设置n个注释标签之前,可以先在m个源码文件中确定编译时长较大(例如大于预设时长阈值)的本地代码所在目标源码文件,由于对目标源码文件中的本地代码进行编译所需的编译时长较长,那么可以确定目标源码文件中的本地代码导致待编译代码的编译时长较长。
进而可以按照步骤S101至步骤S104,在所述目标源码文件的本地代码中设置所述n个注释标签,具体判断目标源码文件的本地代码中哪段代码所需的编译时长过长,从而无需对目标源码文件以外的其他源码文件中代码的编译时长进行判断,有利于快速确定导致待编译代码整体编译时长较长的代码段,进而可以确定针对该代码段进行编译所需的编译时长。
图3是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。如图3所示,每个所述源码文件还包括头文件,所述在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件包括:
在步骤S1051中,对所述m个源码文件中第p个源码文件和所述第p个源码文件中的头文件分别进行编译,获取编译所述第p个源码文件的第p源码文件时长,以及编译所述第p个源码文件中的头文件的第p头文件时长,其中,1≤p≤m;
在步骤S1052中,计算所述第p源码文件时长与所述第p头文件时长的第p差值时长;
在步骤S1053中,确定m个所述源码文件对应的m个差值时长中,大于所述预设时长阈值的目标差值时长对应的目标源码文件。
在一个实施例中,由于源码文件包括本地代码和头文件,对于源码文件本身和其中的头文件,可以通过相关技术中的方式确定编译所需的编译时长,而无需采用步骤S101至步骤S104所述的方式。
那么为了判断哪个源码文件中的本地代码的编译时长过长,对于m个源码文件中每个源码文件和源码文件中的头文件可以分别进行编译,例如对阵第p个源码文件而言,可以对第p个源码文件和所述第p个源码文件中的头文件分别进行编译,获取编译所述第p个源码文件的第p源码文件时长,以及编译所述第p个源码文件中的头文件的第p头文件时长。
而第p源码文件时长与所述第p头文件时长的第p差值时长,就是编译第p个源码文件中本地代码的编译时长,所以在m个所述源码文件对应的m个差值时长中,可以先确定较大(例如大于预设时长阈值)的目标差值时长,进而可以确定目标差值时长就是对应的目标源码文件中的本地代码的编译时长较长。
图4是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。如图4所示,在获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码之前,所述方法还包括:
在步骤S106中,指定编译程序为预设代理(proxy)程序;
其中,所述预设代理程序中至少包含第一命令、第二命令和第三命令,其中,所述第一命令用于获取所述待编译代码中的每部分代码,所述第二命令用于调用所述编译程序进行至少一次编译操作,所述第三命令用于获取每次编译操作的时长;
在步骤S107中,运行所述预设代理程序。
需要说明的是,步骤S106和步骤S107可以如图4所示在步骤S101之前执行,也可以根据需要调整执行顺序,只需保证在步骤S102之前执行即可。
在一个实施例中,所述待编译代码可以通过编译程序进行编译,例如所述待编译代码为C++代码,所述编译程序包括以下至少之一:g++、ar、ld。但是通过编译程序直接编译代码,只会执行一次编译操作,难以按照步骤S101至步骤S104执行多次编译,例如对第一部分代码和第二部分代码分别进行编译。
本实施例将编译程序指定为预设代理程序,而预设代理程序是预先编制的,其中至少包含第一命令、第二命令和第三命令,其中,所述第一命令用于获取所述待编译代码中的每部分代码,所述第二命令用于调用所述编译程序进行至少一次编译操作,所述第三命令用于获取每次编译操作的时长。
据此,在执行预设代理程序时,可以执行预设代理程序中的命令,例如通过执行第一命令,可以获取待编译代码中的每部分代码;通过执行第二命令,可以调用编译程序进行至少一次编译操作,而编译操作的对象,可以通过设置其他命令指定,据此,可以通过编译程序对不同的对象分别进行编译,例如可以对第一部分代码和第二部分代码分别进行编译;通过执行第三命令,可以获取编译程序每次编译操作的时长,例如所述第三命令可以是linux time命令,从而可以获取到编译第一部分代码的第一部分时长,以及编译第二部分代码的第二部分时长。
其中,可以通过执行make指令来指定编译程序为预设代理程序,具体地,执行make指令可以读入makefile文件,可以通过设置makefile的环境变量来指定编译程序为预设代理程序。进而在make程序执行时,会触发预设代理程序的运行,从而执行预设代理程序中的命令。
另外,可以设置预设代理程序与电子设备中运行的数据采集进程进行通信,例如通过rpyc(Remote Python Call)协议通信,从而可以将获取到的第一部分时长、第二部分时长等信息发送至数据采集进程进行汇总。
图5是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。如图5所示,所述对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长包括:
在步骤S1031中,对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码得到第一中间文件的第一中间文件时长,以及编译所述第二部分代码得到第二中间文件的第二中间文件时长;
在步骤S1032中,获取根据所述第一中间文件生成第一可执行文件的第一可执行文件时长,以及根据所述第二中间文件生成第二可执行文件的第二可执行文件时长;
在根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长之后,所述方法还包括:
在步骤S108中,根据所述第二中间文件时长和所述第一中间文件时长的差值,确定编译所述目标代码得到目标中间文件的目标中间文件时长,以及根据所述第二可执行文件时长和所述第一可执行文件时长的差值,确定根据所述目标中间文件生成目标可执行文件的目标可执行文件时长;
在步骤S109中,根据所述目标代码、所述目标中间文件和所述目标可执行文件之间的依赖关系,以及所述目标中间文件时长和所述目标可执行文件时长生成图像。
在一个实施例中,对源码文件进行编译的过程可以分为两步,其一是对源码文件进行编译得到中间文件(也可称作目标文件),其二是根据中间文件生成可执行文件(例如通过连接器将中间文件中的代码和其他代码结合起来生成可执行文件),源码文件、中间文件和可执行文件之间存在依赖关系,依赖关系可以通过树形图表示。
因此,对于第i个注释标签和第j个注释标签之间的目标代码而言,编译目标代码生成目标可执行文件,也可以分为两步,其一是对目标代码进行编译得到目标中间文件,其二是根据目标中间文件生成目标可执行文件,对于这两步操作,可以分别确定操作所需的时长。
具体可以对第一部分代码和第二部分代码分别进行编译,获取编译第一部分代码得到第一中间文件的第一中间文件时长,以及编译第二部分代码得到第二中间文件的第二中间文件时长。从而可以根据第二中间文件时长和第一中间文件时长的差值,确定编译目标代码得到目标中间文件的目标中间文件时长。
还可以获取根据所述第一中间文件生成第一可执行文件的第一可执行文件时长,以及根据所述第二中间文件生成第二可执行文件的第二可执行文件时长。从而可以根据所述第二可执行文件时长和所述第一可执行文件时长的差值,确定根据所述目标中间文件生成目标可执行文件的目标可执行文件时长。
进而可以根据第二中间文件时长和第一中间文件时长的差值,确定编译目标代码得到目标中间文件的目标中间文件时长,以及根据第二可执行文件时长和第一可执行文件时长的差值,确定根据目标中间文件生成目标可执行文件的目标可执行文件时长。
然后可以根据目标代码、目标中间文件和目标可执行文件之间的依赖关系,以及目标中间文件时长和目标可执行文件时长生成图像,例如所述图像可以为火焰图(FlameGraph),火焰图的横坐标表示时间,纵坐标表示依赖关系,根据生成的图像,便于用户直观地确定目标代码、目标中间文件和目标可执行文件之间的依赖关系,还可以确定目标中间文件时长和目标可执行文件时长。
在一个实施例中,若需要生成每两个相邻注释标签之间的代码对应的中间文件时长和可执行文件时长,可以设置j=i+1,那么对所有的i按照图5所示实施例执行操作,可以得到每两个相邻注释标签之间的代码对应的中间文件时长和可执行文件时长。
图6是根据本公开的实施例示出的一种火焰图的示意图。
如图6所示,其中每个矩形框表示一段代码,纵向上多个矩形框之间的连接关系,表示代码之间的依赖关系,其中的依赖关系可以包括但不限于目标代码、目标中间文件和目标可执行文件之间的依赖关系。横向上矩形框的长度表示对矩形框中代码进行编译所需的时长,或者表示根据矩形框中代码生成另一个文件所需的时长。
通过生成图像,便于用户直观地查看编译每段代码所需的时长,以及快速确定代码之间的依赖关系。并且还可以提供搜索功能,例如在图6所示火焰图的右上方显示搜索框,可以在搜索框中输入需要搜索文件的名称,或者需要搜索的目标代码对应的注释标签等,从而火焰图可以显示搜索结果对应的内容,例如放大显示某段目标代码和其他文件的依赖关系以及进行编译所需的时长。
另外,对于待编译代码中的每个源码文件,可以分别确定进行编译所需的时长,并显示源码文件的路径和对应的时长,例如图7所示:
对其中文件路径为.build/dbg/targets/teams/ad/ad_server/libkconf.a的源码文件进行编译所需的时长为11.10m(分钟)。
进一步地,对于每个源码文件中本地(local)代码,也可以确定进行编译所需的时长,并显示本地代码的路径和对应的时长,例如图8所示:
对其中文件路径为teams/ad/ad_server/util/kconf/kconf.cc的本体代码进行编译所需的时长为9.77m(分钟)。
其中,图6至图7所示的图像可以不同页面中显示,也可以在同一个页面中显示,所述页面可以是html页面。
图9是根据本公开的实施例示出的又一种代码编译时长确定方法的示意流程图。
在一个实施例中,所述代码编译时长确定方法的总体流程可以如图9所示:
在步骤SA中,本实施例可以基于linux makefile编译工具实现,生成linuxmakefile文件,以供后续执行make命令时读入。
在步骤SB中,启动数据采集进程,数据采集进程可以是后台进程,并且可以通过rpyc与预设代理程序通信。
在步骤SC中,makefile文件允许通过环境变量指定编译程序为其他程序,基于此,可以在执行make命令时,通过对读入的makefile文件的环境变量进行替换,将调用的编译程序指定为预设代理程序,以便后续执行make程序时,能够触发预设代理程序运行。
在步骤SD中,执行make程序。
在步骤SE中,执行make程序可以触发编译程序运行,但是由于已将编译程序指定为预设代理程序,那么就会触发预设代理程序运行。
在步骤SF中,预设代理程序在运行时,会调用编译程序,例如g++、ar、ld等,对代码进行编译,并且针对不同注释标签之前的代码,可以多次调用编译程序进行编译,从而记录编译操作所需的时长,例如记录对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长。
在步骤SG中,预设代理程序可以通过分析确定编译两个注释标签之间代码所需的编译时长,例如;根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长。
在步骤SH中,预设代理程序可以将确定的编译时长发送至数据采集进程,除了发送编译时长,还可以发送依赖关系等信息。
在步骤SI中,数据采集进程可以汇总接收到的信息生成图像,例如生成如图6至图8所示的图像,以供用户查看。
与前述代码编译时长确定方法的实施例相对应地,本公开还提出了代码编译时长确定装置的实施例。
图10是根据本公开的实施例示出的一种代码编译时长确定装置的示意框图。本实施例所述的装置可以适用于能够编译代码的电子设备,所述电子设备可以是终端,也可以是服务器,所述终端包括但不限于手机、平板电脑、可穿戴设备、个人计算机等。
如图10所示,所述代码编译时长确定装置可以包括:
标签设置模块101,被配置为执行在待编译代码中设置n个注释标签,n>1;
代码获取模块102,被配置为执行获取所述n个注释标签中第i个注释标签之前的第一部分代码,以及所述n个注释标签中第j个注释标签之前的第二部分代码,1≤i<j≤n;
代码编译模块103,被配置为执行对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码的第一部分时长,以及编译所述第二部分代码的第二部分时长;
时长确定模块104,被配置为执行根据所述第二部分时长和所述第一部分时长的差值,确定编译所述第i个注释标签到所述j个注释标签之间目标代码的时长。
图11是根据本公开的实施例示出的另一种代码编译时长确定装置的示意框图。如图11所示,所述待编译代码包含m个源码文件,每个所述源码文件包括本地代码,其中,m≥1,在待编译代码中设置n个注释标签之前,所述装置还包括:
文件确定模块105,被配置为执行在所述m个源码文件中确定编译时长大于预设时长阈值的本地代码所在的目标源码文件;
其中,所述标签设置模块101,被配置为执行在所述目标源码文件的本地代码中设置所述n个注释标签。
图12是根据本公开的实施例示出的一种文件确定模块的示意框图。如图12所示,每个所述源码文件还包括头文件,所述文件确定模块105包括:
编译子模块1051,被配置为执行对所述m个源码文件中第p个源码文件和所述第p个源码文件中的头文件分别进行编译,获取编译所述第p个源码文件的第p源码文件时长,以及编译所述第p个源码文件中的头文件的第p头文件时长,其中,1≤p≤m;
计算子模块1052,被配置为执行计算所述第p源码文件时长与所述第p头文件时长的第p差值时长;
确定子模块1053,被配置为执行确定m个所述源码文件对应的m个差值时长中,大于所述预设时长阈值的目标差值时长对应的目标源码文件。
图13是根据本公开的实施例示出的又一种代码编译时长确定装置的示意框图。如图13所示,所述装置还包括:
程序执行模块106,被配置为执行指定编译程序为预设代理程序;
其中,所述预设代理程序中至少包含第一命令、第二命令和第三命令,其中,所述第一命令用于获取所述待编译代码中的每部分代码,所述第二命令用于调用所述编译程序进行至少一次编译操作,所述第三命令用于获取每次编译操作的时长;
程序运行模块107,被配置为执行运行所述预设代理程序。
图14是根据本公开的实施例示出的又一种代码编译时长确定装置的示意框图。如图14所示,所述代码编译模块,被配置为执行对所述第一部分代码和所述第二部分代码分别进行编译,获取编译所述第一部分代码得到第一中间文件的第一中间文件时长,以及编译所述第二部分代码得到第二中间文件的第二中间文件时长;以及获取根据所述第一中间文件生成第一可执行文件的第一可执行文件时长,以及根据所述第二中间文件生成第二可执行文件的第二可执行文件时长;
所述时长确定模块,还被配置为执行根据所述第二中间文件时长和所述第一中间文件时长的差值,确定编译所述目标代码得到目标中间文件的目标中间文件时长,以及根据所述第二可执行文件时长和所述第一可执行文件时长的差值,确定根据所述目标中间文件生成目标可执行文件的目标可执行文件时长;
所述装置还包括:
图像生成模块108,根据所述目标代码、所述目标中间文件和所述目标可执行文件之间的依赖关系,以及所述目标中间文件时长和所述目标可执行文件时长生成图像。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
本公开实施例示出的代码编译时长确定装置的实施例可以应用在终端或服务器等电子设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图15所示,为根据本公开的实施例示出的代码编译时长确定装置所在设备的一种硬件结构图,除了图15所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等;从硬件结构上来讲该设备还可能是分布式的设备,可能包括多个接口卡,以便在硬件层面进行报文处理的扩展。
本公开的实施例还提出一种电子设备,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现上述任一实施例所述的代码编译时长确定方法。
本公开的实施例还提出一种存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行上述任一实施例所述的代码编译时长确定方法。
本公开的实施例还提出一种计算机程序产品,所述计算机程序产品被配置为执行上述任一实施例所述的代码编译时长确定方法。
可选地,存储介质可以是非临时性计算机可读存储介质,例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
本公开的实施例还提出一种计算机程序产品,所述计算机程序产品被配置为执行上述任一实施例所述的代码编译时长确定方法。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本公开实施例所提供的方法和装置进行了详细介绍,本文中应用了具体个例对本公开的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本公开的方法及其核心思想;同时,对于本领域的一般技术人员,依据本公开的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本公开的限制。
- 代码编译时长确定方法、装置、电子设备和存储介质
- 代码编译方法、装置、电子设备、存储介质及异构系统