计算机程序中热点函数、变量的汇聚方法、装置及系统
技术领域
本发明涉及计算机技术,尤其涉及一种计算机程序中热点函数、变量的汇聚方法、装置及系统。
背景技术
在计算机程序软件开发过程中,程序设计人员一般以功能模块为单位部署函数代码及变量,在源程序编译链接后,函数对应的二进制代码和全局变量也是按照其在源程序文件内的顺序排列,因此当函数和/或变量调用相邻或较近时,程序执行中不会发生访问跳变,而当函数或全局变量调用较远时,程序执行中将会发生访问跳变,从而处理器在访问缓存时易出现较多的未命中(Cache Miss)现象。
为降低程序执行中由于访问跳变而引起的Cache Miss现象,现有技术中一般采用插桩统计技术,即首先在程序的每个函数的入口插入执行统计代码以统计该函数的执行次数,其次获取程序运行后的函数调用次数排序,接着修改源代码,以在调用次数较高的函数声明处增加修饰代码,最后使用编译器重新编译源码并链接,其中调用频率较高的函数会被归并到热点函数段中,因此,采用插桩统计的方法可降低这些调用频率较高函数的执行时产生的指令跳变,从而降低指令Cache Miss。
图1为软件系统源程序文件中函数及全局变量的代码结构示意图,该软件系统的热点业务对应的关键路径中函数调用顺序为:funcD→funcB→funcF→funcA→funcP→funcG,图2为采用插桩统计技术获取的可执行文件代码段及数据段的结构示意图,图中有向箭头线表示运行可执行文件时指令跳转的方向,由图2可知,对于上述关键路径中的函数被汇聚在了热点函数段中,从图中可以看到,尽管热点函数被汇聚在一起了,但函数调用跳转仍存在且发生了5次,全局变量访问跳转发生了6次,因此,系统运行时仍会出现较多的指令Cache Miss和数据Cache Miss,从而采用插桩统计方法仍未能有效提高系统性能。
发明内容
本发明实施例提供一种计算机程序中热点函数、变量的汇聚方法、装置及系统,用以降低程序执行时的指令Cache Miss或者数据Cache Miss,提高系统性能。
本发明的第一个方面是提供一种计算机程序中热点函数的汇聚方法,包括:
获取待处理的源程序;
模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条函数关键路径;其中,函数关键路径用于描述执行所述源程序时的一个或多个热点函数,以及热点函数间的调用顺序;
根据所述关键路径文件将所述源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内。
结合第一个方面的计算机程序中热点函数的汇聚方法,在第一种实现方式中,在所述源程序的执行过程中还收集所述源程序中每个全局变量的访问信息,所述关键路径文件还包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序;
所述汇聚方法,还包括:根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
结合第一个方面的计算机程序中热点函数的汇聚方法的第一种实现方式,在第二种实现方式中,模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息以及每个全局变量的访问信息,以生成关键路径文件,包括:
分析所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息以及每个全局变量的访问信息,以生成原始路径信息;其中,所述原始路径信息包括:所述源程序中每个函数所在的函数路径、每个函数在函数路径中的层数、每个函数的调用次数以及用于记录每个函数路径中所有函数调用次数之和的路径计数,以及,所述源程序中每个全局变量所在的数据路径、每个全局变量在数据路径中的层数、每个全局变量的访问次数以及用于记录每个数据路径中所有全局变量的访问次数之和的路径计数;
按照所述原始路径信息中每个函数路径对应的路径计数由大到小对函数路径进行排序,将获取的路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径,以及按照所述原始路径信息中每个数据路径对应的路径计数由大到小对数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
结合第一个方面的计算机程序中热点函数的汇聚方法的第二种实现方式,在第三种实现方式中,分析所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息以及每个全局变量的访问信息,以生成原始路径信息,包括:
逐条翻译并执行所述源程序中的语句,对于每一条语句,若确定该语句为函数调用或全局变量访问,则记录该语句中的函数名或全局变量名以及该函数名被调用或全局变量名被访问时所在的层数,生成原始路径信息。
结合第一个方面的计算机程序中热点函数的汇聚方法的第二或第三种实现方式,在第四种实现方式中,按照所述原始路径信息中每个函数路径对应的路径计数由大到小对函数路径进行排序,获取路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径,包括:
去除每条函数路径中调用次数占所在函数路径的路径计数比例小于预设比例的函数以简化函数路径,合并简化后的相同函数路径;
将合并的函数路径的路径计数进行叠加,并按照合并后的每个函数路径对应的路径计数由大到小对各条函数路径进行排序,获取路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径;
按照所述原始路径信息中每个数据路径对应的路径计数由大到小对数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为函数关键路径,包括:
去除每条数据路径中访问次数占所在数据路径的路径计数比例小于预设比例的全局变量以简化数据路径,合并简化后的相同数据路径;
将合并的数据路径的路径计数进行叠加,并按照合并后的每个数据路径对应的路径计数由大到小对各条数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
结合第一个方面的计算机程序中热点函数的汇聚方法、第一、第二、第三或第四种实现方式,在第五种实现方式中,根据所述关键路径文件将所述源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内,包括:
将所述源程序中位于所述关键路径文件中同一函数关键路径上的函数配置同一代码段标识,并依照同一函数关键路径上函数的调用顺序配置函数在同一代码段中的位置信息;
根据所述函数对应的代码段标识及位置信息将所述源程序中对应的函数进行编译后链接在一起。
结合第一个方面的计算机程序中热点函数的汇聚方法的第五种实现方式,在第六种实现方式中,若两个函数关键路径中存在对同一函数的调用,则为该函数配置调用次数较多的函数关键路径对应的代码段标识。
本发明的第二个方面是提供一种计算机程序中热点全局变量的汇聚方法,包括:
获取待处理的源程序;
模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序;
根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
结合第二个方面的计算机程序中热点全局变量的汇聚方法,在第一种实现方式中,根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内,包括:
将所述源程序中位于所述关键路径文件中同一数据关键路径上的全局变量配置同一数据段标识,并依照同一数据关键路径上全局变量的访问顺序配置全局变量在同一数据段中的位置信息;
根据所述全局变量对应的数据段标识及位置信息将所述源程序中对应的全局变量进行编译后链接在一起。
结合第二个方面的计算机程序中热点全局变量的汇聚方法的第一种实现方式,在第二种实现方式中,若两个数据关键路径中存在对同一全局变量的访问,则为该全局变量配置访问次数较多的数据关键路径对应的段标识。
本发明的第三个方面是提供一种编译装置,包括:
获取模块,用于获取待处理的源程序;
路径分析模块,用于模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条函数关键路径;其中,函数关键路径用于描述执行所述源程序时的一个或多个热点函数,以及热点函数间的调用顺序;
函数汇聚模块,用于根据所述关键路径文件将所述源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内。
结合第三个方面的编译装置,在第一种实现方式中,所述路径分析模块,还用于在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,所述关键路径文件还包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序;
所述编译装置,还包括:
变量汇聚模块,用于根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
结合第三个方面的编译装置的第一种实现方式,在第二种实现方式中,所述路径分析模块包括:
原始路径生成单元,用于分析所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息以及每个全局变量的访问信息,以生成原始路径信息;其中,所述原始路径信息包括:所述源程序中每个函数所在的函数路径、每个函数在函数路径中的层数、每个函数的调用次数以及用于记录每个函数路径中所有函数调用次数之和的路径计数,以及,所述源程序中每个全局变量所在的数据路径、每个全局变量在数据路径中的层数、每个全局变量的访问次数以及用于记录每个数据路径中所有全局变量的访问次数之和的路径计数;
关键路径生成单元,用于按照所述原始路径信息中每个函数路径对应的路径计数由大到小对函数路径进行排序,将获取的路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径,以及按照所述原始路径信息中每个数据路径对应的路径计数由大到小对数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
结合第三个方面的编译装置的第二种实现方式,在第三种实现方式中,所述原始路径生成单元,具体用于逐条翻译并执行所述源程序中的语句,对于每一条语句,若确定该语句为函数调用或全局变量访问,则记录该语句中的函数名或全局变量名以及该函数名被调用或全局变量名被访问时所在的层数,生成原始路径信息。
结合第三个方面的编译装置的第一或第二种实现方式,在第三种实现方式中,所述关键路径生成单元,具体用于去除每条函数路径中调用次数占所在函数路径的路径计数比例小于预设比例的函数以简化函数路径,合并简化后的相同函数路径;将合并的函数路径的路径计数进行叠加,并按照合并后的每个函数路径对应的路径计数由大到小对各条函数路径进行排序,获取路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径;以及具体用于去除每条数据路径中访问次数占所在数据路径的路径计数比例小于预设比例的全局变量以简化数据路径,合并简化后的相同数据路径;将合并的数据路径的路径计数进行叠加,并按照合并后的每个数据路径对应的路径计数由大到小对各条数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
结合第三个方面的编译装置的第一、第二或第三种实现方式,在第四种实现方式中,所述函数汇聚模块,具体用于将所述源程序中位于所述关键路径文件中同一函数关键路径上的函数配置同一代码段标识,并依照同一函数关键路径上函数的调用顺序配置函数在同一代码段中的位置信息;根据所述函数对应的代码段标识及位置信息将所述源程序中对应的函数进行编译后链接在一起。
本发明的第四个方面是提供一种编译装置,包括:
获取模块,用于获取待处理的源程序;
路径分析模块,用于模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序;
变量汇聚模块,用于根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
结合第四个方面的编译装置,在第一种实现方式中,所述变量汇聚模块,具体用于将所述源程序中位于所述关键路径文件中同一数据关键路径上的全局变量配置同一数据段标识,并依照同一数据关键路径上全局变量的访问顺序配置全局变量在同一数据段中的位置信息;根据所述全局变量对应的数据段标识及位置信息将所述源程序中对应的全局变量进行编译后链接在一起。
本发明的第五个方面是提供一种计算机程序处理系统,包括:程序执行装置和上述的编译装置,所述程序执行装置用于执行处理所述编译装置编译后链接生成的可执行文件。
本发明实施例通过模拟执行源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,生成关键路径文件,再根据所述关键路径文件将所述源程序中位于同一函数关键路径上的函数依照调用顺序进行编译后链接在同一代码段内,使得编译链接后生成的可执行文件中处于同一代码段中的函数编码对应于与热点业务对应的同一函数关键路径上的函数调用,从而使得执行可执行文件时可有效降低函数调用产生的指令跳变,降低指令Cache Miss,提高系统性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为软件系统源程序文件中函数及全局变量的代码结构示意图;
图2为采用插桩统计技术获取的可执行文件代码段及数据段的结构示意图;
图3为本发明实施例提供的计算机程序中热点函数的汇聚方法的流程图;
图4为本发明实施例提供的生成关键路径文件的流程图;
图5为图4中源程序模拟执行过程的流程图;
图6为图5中模拟执行过程中生成原始路径信息的流程图;
图7为图6中生成的原始路径信息中函数路径的列表;
图8为本发明实施例提供的简化合并路径的流程图;
图9为本发明实施例提供的路径合并简化后得到的关键路径文件;
图10为本发明实施例提供的对源程序中热点函数进行汇聚的流程图;
图11为图10中对热点函数进行段划分的分配结果示意图;
图12为依照本发明实施例的方法汇聚后形成的可执行文件中代码段和数据段的结构示意图;
图13为本发明实施例提供的计算机程序中热点全局变量的汇聚方法的流程图;
图14为本发明提供的编译装置实施例一的结构示意图;
图15为本发明提供的编译装置实施例二的结构示意图;
图16为本发明提供的编译装置实施例三的结构示意图;
图17为本发明提供的编译装置实施例四的结构示意图;
图18本发明提供的编译装置应用实施例的结构示意图;
图19为本发明提供的计算机程序处理系统实施例的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图3为本发明实施例提供的计算机程序中热点函数的汇聚方法的流程图,如图3所示,本实施例的方法的执行主体可以为编译装置,计算机程序在执行之前,需要由编译装置将程序设计人员编写的程序代码进行编译生成机器可识别的二进制可执行文件,本实施例的方法就是编译装置在编译过程中执行的操作步骤,其操作步骤,包括:
步骤101、获取待处理的源程序。
步骤102、模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条函数关键路径。
其中,函数关键路径用于描述执行所述源程序时的一个或多个热点函数,以及热点函数间的调用顺序。
本实施例中,根据源程序执行程序模拟,由于程序模拟过程类似于源程序执行过程,其包括各个函数的调用过程,因此在程序模拟过程中可获取源程序中函数的调用顺序。实际应用中,软件系统内的函数和全局变量通常不是平均被调用的,那些频繁被调用的函数和全局变量分别称为是软件系统的热点函数和热点全局变量,在本发明所有实施例中,分别将被调用或访问的频率超过阈值的函数和全局变量作为热点函数和热点全局变量(需要说明的是,本发明并不具体限定阈值的具体数值,本领域技术人员可以根据经验灵活设定),这些热点函数间的调用顺序对应着软件系统的热点业务,在计算机程序软件中,通常使用路径(Path)如:a→b→…→d表示程序在执行过程中调用函数或访问全局变量的先后顺序轨迹,关键路径(Critical Path)为指定的路径计数最大的N条路径,函数关键路径反映了程序执行时的某些热点业务,以及执行这些热点业务时的函数调用顺序,数据关键路径反映了程序执行时的某些热点业务,以及执行这些热点业务时的全局变量访问顺序。由于热点业务对应的函数关键路径并非与源程序中函数的编写顺序完全一致,因此,依照源程序中函数编写顺序编译后链接形成可执行文件时,由于函数关键路径中函数调用顺序与源程序中函数编写顺序的不一致,而使执行该可执行文件时会出现较多的指令跳变,从而出现指令Cache Miss。
为有效降低指令跳变,本步骤中通过对源程序中与热点业务对应的函数关键路径分析,提取热点业务中包含的热点函数,并依照收集的函数调用信息获取包含函数关键路径的关键路径文件,以便于后续根据该关键路径文件中的函数关键路径将源程序中与热点业务相关的热点函数依照函数在函数关键路径中的调用顺序编译后链接在一起。
步骤103、根据所述关键路径文件将所述源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内。
上述对函数关键路径进行分析提取,形成关键路径文件后,本步骤执行编译链接生成可执行文件时,能够根据函数关键路径将热点业务中包含的函数依照其之间调用顺序进行,而且处于同一函数关键路径上的函数编译链接后被汇聚于同一机器可识别代码区域,由于通过这种关键路径分析方法生成的可执行文件中对应的函数编码顺序与热点业务对应的函数关键路径一致,即可执行文件中被链接汇聚在同一代码段的二进制编码对应于同一函数关键路径上的函数调用,即对应于热点业务,相比插桩统计方法不仅将调用次数较多的热点函数聚集在一起,而且在汇聚时还考虑到各个函数之间的调用先后顺序,因此,当软件系统运行时,可有效降低函数调用产生的指令跳变,降低指令Cache Miss,提高系统性能。本发明实施例通过模拟执行源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,生成关键路径文件,再根据所述关键路径文件将所述源程序中位于同一函数关键路径上的函数依照调用顺序进行编译后链接在同一代码段内,使得编译链接后生成的可执行文件中处于同一代码段中的函数编码对应于与热点业务对应的同一函数关键路径上的函数调用,从而使得执行可执行文件时可有效降低函数调用产生的指令跳变,降低指令Cache Miss,提高系统性能。
为进一步提高系统性能,在上述实施例的基础上,还可以通过降低全局变量访问跳变以减少数据Cache Miss。具体来说,在所述源程序的执行过程中还收集所述源程序中每个全局变量的访问信息,从而所述关键路径文件还包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序,因此,上述实施例在进行源程序编译链接形成可执行文件过程中,还可以包括:根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内,在源程序的模拟过程中,可分析出全局变量的访问顺序,同上述函数调用类似,全局变量的访问也是不均匀的,经常被访问的全局变量及其访问顺序对应着软件系统的热点业务,因此通过提取热点业务中包含的热点全局变量并依照其访问顺序形成数据关键路径,当对源程序进行编译链接后能够将同一数据关键路径上的全局变量汇聚到赋初值的数据段,因此,当软件系统运行时,同样可有效降低全局变量访问产生的数据跳变,降低数据Cache Miss,提高系统性能。
图4为本发明实施例提供的生成关键路径文件的流程图,图5为图4中源程序模拟执行过程的流程图,图6为图5中模拟执行过程中生成原始路径信息的流程图,图7为图6中生成的原始路径信息中函数路径的列表,如图4至图7所示,在源程序模拟生成关键路径文件过程的操作步骤包括:
步骤201、分析所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,以生成原始路径信息。
图7所示的是函数路径信息,全局变量对应的数据路径信息与图7所示的列表类似,即原始路径信息包括:所述源程序中每个函数所在的函数路径、每个函数在函数路径中的层数、每个函数的调用次数以及用于记录每个函数路径中所有函数调用次数之和的路径计数,以及,所述源程序中每个全局变量所在的数据路径、每个全局变量在数据路径中的层数、每个全局变量的访问次数以及用于记录每个数据路径中所有全局变量的访问次数之和的路径计数。如表中路径编号为1的函数路径中其函数调用顺序为funcE(5)→funcD(56)→funcB(78)→funcF(76)→funcA(1000)→funcP(8767)→funcG(8972)→…,其中,函数funcE的调用次数为5次,该路径总的路径计数为各个函数调用的次数总和29879,形成的该原始路径信息列表可以存储在存储器中。
如图5所示,在编译装置执行程序模拟,分析程序代码生成原始路径信息过程中,具体操作包括:
步骤301、获取源程序中的一个语句。
步骤302、模拟执行该语句。在模拟执行中可通过将获取的语句提交给翻译执行器进行执行。
步骤303、判断该语句是否为函数调用或全局变量引用,若是函数调用或者全局变量引用,则执行步骤304,否则执行步骤301获取下一个语句。
步骤304、记录函数或全局变量信息,生成原始路径信息。函数或全局变量信息包括语句中的函数名/全局变量名以及该函数名/全局变量名被引用时所在的层数。
通过图5所示的方法可遍历源程序中每个语句,获取源程序中每个函数及全局变量的调用信息。为使记录的原始路径中相同的路径进行路径计数合并,便于后续提取关键路径,在记录语句中的函数名或全局变量信息生成原始路径信息过程中,本发明中一方面将重复出现的函数调用或全局变量引用的路径进行路径计数合并,另一方面还将源程序中出现函数调用跳转的函数连接到同一路径中相邻的位置,使得后续根据路径计数获取关键路径后,对关键路径进行编译链接时源程序中发生函数调用跳转的函数也能够汇聚到同一代码段的相邻位置,因此减少了因函数调用跳转而产生的指令跳变。记录语句中的函数名或全局变量名以及该函数名或全局变量名被引用时所在的层数,生成原始路径信息,具体可包括:确定语句中的函数名或全局变量名以及该函数名或全局变量名被引用时所在的层数;若该函数名或全局变量名被引用时所在的层数大于等于活动路径的深度,则确定该函数名或全局变量名是否与活动路径末节点所表示的函数名或全局变量名相同,若相同,则将活动路径的深度更新为与该函数名或全局变量名被引用时所在的层数相等,并将活动路径的路径计数加一,否则将该活动路径的末节点表示的函数名或全局变量名更新为该函数名或全局变量名,将活动路径的深度更新为与该函数名或全局变量名被引用时所在的层数相等,并将活动路径的路径计数加一,所述活动路径为路径分析过程中的当前路径,所述活动路径的深度为活动路径末节点所在的层数;若该函数名或全局变量名被引用时所在的层数小于活动路径的深度,则确定活动路径是否为原始路径信息中已知路径的子集,若是则将该已知路径的路径计数加上活动路径的路径计数,并创建新路径,所述新路径的首节点和末节点设置为该函数名或全局变量名,新路径的深度设置为该函数名或全局变量名被引用时所在的层数,新路径的路径计数设置为1,设置所述新路径为新的活动路径,否则,存储该活动路径于原始路径信息,并创建新路径,所述新路径的首节点和末节点设置为该函数名或全局变量名,新路径的深度设置为该函数名或全局变量名被引用时所在的层数,新路径的路径计数设置为1,设置所述新路径为新的活动路径,所述路径计数为函数路径上所有节点表示的函数名或数据路径上所有节点表示的全局变量名被引用的次数之和。
具体实施中,记录函数或全局变量调用信息生成原始路径信息的过程可如图6所示,其操作步骤包括:
步骤401、获取函数名或全局变量名A及其所在的层数L。函数或全局变量所在的层数为其被引用时所在路径上的深度,例如存在路径a→b→c→d→e→f,则函数c位于第3层,f位于第5层,如果在函数c内引用了全局变量var100,那么var100也具有层数3。
步骤402、判断L是否大于等于活动路径的深度AP.L,若是则执行步骤403,以进行源程序中函数或全局变量调用跳转时的路径连接,否则执行步骤406,以合并相同路径或路径的子集的路径计数,并重置活动路径。
活动路径为在路径分析过程中标识为当前分析中的路径,活动路径的深度AP.L为路径分析过程中标识为当前路径的末节点所在的层数。
步骤403、A是否与活动路径末节点AP.Last相同,若相同,则执行步骤404,否则,将A作为活动路径的末节点后再执行步骤404,也就是说,将源程序中发生函数或全局变量调用跳转的A连接到当前活动路径AP中,使得后续依照存储的活动路径AP对源程序进行编译链接时能够将A汇聚在路径AP所对应的段中,且避免了发生指令跳变。
步骤404、将A所在的层数赋给活动路径的深度AP.L。将函数或全局变量A加入当前的活动路径AP中。
步骤405、活动路径的路径计数加1,更新当前活动路径的路径计数,返回步骤401获取下一个函数或全局变量及其所在的层数进行处理。
步骤406、活动路径AP是否为已知路径P的子集,若是则执行步骤407进行路径合并,否则保存当前的活动路径AP后执行步骤408创建新路径
步骤407、将已知路径的路径计数P.Cnt加上活动路径的路径计数AP.Cnt,由于活动路径AP是否为已知路径P的子集,将活动路径AP合并到已知路径P中。
步骤408、创建新路径NP,并将新路径的首节点NP.Head和末节点NP.Last设置为该函数名/全局变量名A,新路径的深度NP.L设置为该函数名/全局变量名A被引用时所在的层数L,新路径的路径计数NP.Cnt设置为1。
步骤409、设置所述新路径为新的活动路径,返回步骤401获取新的函数或全局变量及其层数进行处理。
通过如图6所示的操作过程可以遍历源程序中所有函数及全局变量的调用信息,使得记录的原始路径中相同的路径进行路径计数合并,有利于根据路径计数进行排序并提取关键路径。图7所示原始路径信息列表中显示的即为根据上述方法遍历合并后的各个函数路径的原始路径信息,根据该路径信息可以对各个路径进行排序,获取源程序中热点业务包含的热点函数对应的函数关键路径,如路径编号为1的路径由于其路径计数总数最多,为29879,其路径funcE(5)→funcD(56)→funcB(78)→funcF(76)→funcA(1000)→funcP(8767)→funcG(8972)→…对应着源程序中的热点业务中函数的调用顺序。表中某些路径在前面几层是空白的,表示他们继承了路径编号更靠前的路径的上层调用信息,如路径1的关系是:
funcE→funcD→funcB→funcF→…,路径2继承了路径1的前置调用关系,即路径2为:
funcE→funcD→funcH→funcI→…
路径3继承了路径2的前置调用关系,路径3为:
funcE→funcD→funcH→funcI→funcJ→funcK→funcCD
通过在路径编号靠后的路径上留出空白可保证对于同一函数或全局变量的引用次数不出现重复统计。
步骤202、按照所述原始路径信息中每个函数路径对应的路径计数由大到小对函数路径进行排序,将获取的路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径。
上述图4所示为函数关键路径的获取过程,数据关键路径的获取过程与函数关键路径的获取过程类似。
实际应用中,在路径计数排序后,可根据需要提取路径计数较多的一个或多个路径作为关键路径,生成关键路径文件,使得后续可根据这些关键路径中的函数或全局变量的调用顺序对源程序中的函数或全局变量进行编译后链接在可执行文件中的同一段内,从而在软件系统运行时同一段内的代码运行时不会发生指令跳变或数据跳变。
上述图7所示的原始路径信息列表包括全部函数的路径信息表,在实际应用中,还可以通过忽略掉路径中引用次数所占比例较小的函数或全局变量,以进一步简化合并路径。图8为本发明实施例提供的简化合并路径的流程图,图9为本发明实施例提供的路径合并简化后得到的关键路径文件,如图8所示,简化合并路径操作包括:
步骤601、去除每条函数路径中调用次数占所在函数路径的路径计数比例小于预设比例的函数以简化函数路径,合并简化后的相同函数路径。
在获取原始路径信息后,编译装置对存储的原始路径信息进行分析,忽略每个路径下引用所占百分比低于预设比例,如0.1%的节点对应的函数或全局变量。例如对于图5所示的表中路径1,funcE(5)→funcD(56)→funcB(78)→funcF(76)→funcA(1000)→funcP(8767)→…,由于funcE引用次数占整个路径的百分比仅为5/29879*100%=0.016%,因此路径1将简化为:funcD(56)→funcB(78)→funcF(76)→funcA(1000)→funcP(8767)→…,对所有路径进行简化之后,合并存在的相同路径。
步骤602、将合并的函数路径的路径计数进行叠加,并按照合并后的每个函数路径对应的路径计数由大到小对各条函数路径进行排序,获取路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径。
对原始路径信息列表中的路径进行简化合并后,重新计算合并之后的路径计数,最后对路径按照其计数从高到低排列,得到路径计数排序靠前的N条函数路径作为函数关键路径,生成关键路径文件,其文件格式如图9所示,输出的关键路径文件以ASCII码的格式存储,开发人员还可以进行检视并二次编辑,编辑好的关键路径文件可用于后续的源程序中函数与数据重组。
上述图8所示为关键路径文件中函数关键路径的形成过程,关键路径文件中数据关键路径的形成过程与函数关键路径的形成过程类似。
为使生成的关键路径文件记录的信息用于源程序中的函数或全局变量汇聚,需要将上述关键路径文件记录的信息与源程序中的函数或全局变量关联起来,生成段表信息,从而使得软件运行时,能够根据关键路径文件记录的信息进行编译后链接在一起。
图10为本发明实施例提供的对源程序中热点函数进行汇聚的流程图,图11为图10中对热点函数进行段划分的分配结果示意图。如图10所示,对源程序中热点函数进行汇聚的过程包括:
步骤801、将所述源程序中位于所述关键路径文件中同一函数关键路径上的函数配置同一代码段标识,并依照同一函数关键路径上函数的调用顺序配置函数在同一代码段中的位置信息。
根据上述描述可知位于同一函数关键路径上的函数对应于热点业务中的热点函数调用,其在路径上的顺序表示其调用顺序,为使位于同一函数关键路径上的函数能够在源程序编译链接时依照路径上的调用顺序配置代码段中的位置,本发明中将位于同一函数关键路径上的函数配置同一代码段标识,并设置相应的位置信息,即配置偏移位置,从而根据代码段标识和偏移位置可在编译链接时将源程序中的函数配置到相应的代码段及段中的位置。如图11所示,段表信息的第一列源文件名指明源文件,第二列符号指明该源文件内的函数或全局变量,第三列段标识指明该函数或全局变量应在编译时放在哪个段,如text_00表明在编译器在编译file0.c时需要将函数funcA编译成单独的段,并在链接时将该段放在段标识为text_00的段内,段偏移指明段内偏移,表明链接器需要将编译后的funcA放置在段text_00的第3个位置处。
在实际应用中,若两个函数关键路径中存在对同一函数的调用,则为该函数配置调用次数较多的函数关键路径对应的代码段标识。例如若存在两个函数关键路径,路径1:funcD(56)→funcB(78)→funcF(76)→funcA(1000)→funcP(8767)→funcG(8972)→…,路径2:funcH(98)→funcI(99)→funcJ(1000)→funcK(1534)→funcL(3877)→funcB(800)…,由于funcB存在于路径1和路径2,funcB被2引用的次数800大于被1引用的次数78,因此在链接时将funcB聚合到路径2所对应的段内,即将funcH、funcI、funcJ、funcK、funcL、funcB聚合在一起。
为避免关键路径文件生成过程中引入的错误,在生成的段表信息之前,还需对关键路径文件的格式进行检测,确定其格式合法后再与源文件进行比较,以进一步确定内容合法,即关键路径文件中的函数及全局变量应为源程序中的函数及全局变量,如上述任一检测过程中出现不合格的情况,则表明生成的关键路径文件过程中出现了错误,需重新生成关键路径文件。
步骤802、根据所述函数对应的代码段标识及位置信息将所述源程序中对应的函数进行编译后链接在一起。
将源程序中的函数配置好代码段标识及段中的位置信息后,根据这些信息对源程序进行编译链接时能够自动将相应的函数编译成的目标文件链接在相应的段中,形成可执行的二进制文件,该二进制文件中对应于热点业务的函数得到了汇聚,且其调用顺序也得到了有效配置。
上述描述的是对函数关键路径上热点函数的汇聚过程,对数据关键路径上的热点全局变量的汇聚过程与对函数关键路径上热点函数的汇聚过程类似。
以下以具体事例进行说明。
图12为依照本发明实施例的方法汇聚后形成的可执行文件中代码段和数据段的结构示意图,由图12可知,调用顺序为funcD→funcB→funcF→funcA→funcP→funcG的关键路径涉及的函数被汇聚在同一代码段中,相比图2所示的现有技术中采用的插桩统计技术得到的可执行文件,各函数之间的调用不再出现调用跳转,全局变量引用也没有跳转,从而在系统运行时极大降低了指令Cache Miss和数据Cache Miss,系统性能得到有效地提高。
图13为本发明实施例提供的计算机程序中热点全局变量的汇聚方法的流程图,如图13所示,本实施例的方法的执行主体可以为编译装置,计算机程序在执行之前,需要由编译装置将程序设计人员编写的程序代码进行编译生成机器可识别的二进制可执行文件,本实施例的方法就是编译装置在编译过程中执行的操作步骤,其操作步骤,包括:
步骤901、获取待处理的源程序。
步骤902、模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条数据关键路径。
其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序。
步骤903、根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
为降低软件系统中访问全局变量时引起的数据跳变,本发明实施例中通过对源程序中与热点业务对应的数据关键路径分析,提取热点业务中包含的热点全局变量,并依照收集的全局变量访问信息获取包含数据关键路径的关键路径文件,再根据该关键路径文件中的数据关键路径将源程序中与热点业务相关的热点全局变量依照全局变量在数据关键路径中的访问顺序编译后链接在一起。由于通过这种关键路径分析方法生成的可执行文件中对应的数据编码顺序与热点业务对应的数据关键路径一致,即可执行文件中被链接汇聚在同一数据段的二进制编码对应于同一数据关键路径上的全局变量访问,即对应于热点业务,因此,当软件系统运行时,可有效降低全局变量访问产生的数据跳变,降低数据CacheMiss,提高系统性能。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,处理器,如中央处理单元(Central Processing Unit,CPU),执行包括上述方法实施例的步骤;而前述的存储介质包括:只读存储器(read-only memory,ROM)、随机存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
图14为本发明提供的编译装置实施例一的结构示意图,如图14所示,本实施例的装置包括:获取模块10、路径分析模块20和函数汇聚模块30,获取模块10,用于获取待处理的源程序;路径分析模块20,用于模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条函数关键路径;其中,函数关键路径用于描述执行所述源程序时的一个或多个热点函数,以及热点函数间的调用顺序;函数汇聚模块30,用于根据所述关键路径文件将所述源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内。
本实施例中,路径分析模块20根据获取模块10获取的源程序进行程序模拟,获取关键路径文件,函数汇聚模块30根据关键路径文件中的函数关键路径将源程序中位于同一函数关键路径上的热点函数依照调用顺序进行编译后链接在同一代码段内,使得生成的可执行文件中热点业务包含的热点函数调用不再发生指令跳变,从而减少了软件系统运行时的指令Cache Miss。
本发明实施例可用于执行上述图3所示方法实施例的技术方案,其工作原理及达到的技术效果类似,不再详细赘述。
在上述编译装置实施例中,所述路径分析模块,还可用于在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,所述关键路径文件还包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序,以使编译装置在编译时根据所述关键路径文件中数据关键路径将所述源程序中位于同一数据关键路径上的全局变量依照访问顺序进行编译后链接在同一段内,以实现降低全局变量引用的数据跳变,从而减少数据Cache Miss,进一步提高了系统性能。
图15为本发明提供的编译装置实施例二的结构示意图,如图15所示,本实施例的装置在上述图14所示实施例的基础上,还进一步包括:变量汇聚模块40,用于根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。本实施例中路径分析模块20可具体包括:原始路径生成单元210,用于分析所述源程序,并在所述源程序的执行过程中收集所述源程序中每个函数的调用信息以及每个全局变量的访问信息,以生成原始路径信息;其中,所述原始路径信息包括:所述源程序中每个函数所在的函数路径、每个函数在函数路径中的层数、每个函数的调用次数以及用于记录每个函数路径中所有函数调用次数之和的路径计数,以及,所述源程序中每个全局变量所在的数据路径、每个全局变量在数据路径中的层数、每个全局变量的访问次数以及用于记录每个数据路径中所有全局变量的访问次数之和的路径计数;关键路径生成单元220,用于按照所述原始路径信息中每个函数路径对应的路径计数由大到小对函数路径进行排序,将获取的路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径,以及按照所述原始路径信息中每个数据路径对应的路径计数由大到小对数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
本实施例中原始路径生成单元210可对源程序进行分析,根据各个函数和/或全局变量的调用关系生成原始路径信息,关键路径生成单元220对原始路径信息进行处理,提取函数关键路径和/或数据关键路径,生成关键路径文件,从而函数汇聚模块30可根据关键路径文件在对源程序进行编译链接时实现热点函数调用的汇聚,降低指令Cache Miss,而变量汇聚模块40可根据关键路径文件对源程序进行编译链接时实现热点全局变量访问的汇聚,降低数据Cache Miss。
在上述图15所示实施例中,关键路径生成单元220还可对原始路径信息中各个路径进行简化合并处理,以进一步汇聚关键路径中的函数或全局变量,具体来说,关键路径生成单元220具体用于去除每条函数路径中调用次数占所在函数路径的路径计数比例小于预设比例的函数以简化函数路径,合并简化后的相同函数路径;将合并的函数路径的路径计数进行叠加,并按照合并后的每个函数路径对应的路径计数由大到小对各条函数路径进行排序,获取路径计数排序靠前的预定数目或比例的函数路径作为函数关键路径;以及具体用于去除每条数据路径中访问次数占所在数据路径的路径计数比例小于预设比例的全局变量以简化数据路径,合并简化后的相同数据路径;将合并的数据路径的路径计数进行叠加,并按照合并后的每个数据路径对应的路径计数由大到小对各条数据路径进行排序,将获取的路径计数排序靠前的预定数目或比例的数据路径作为数据关键路径。
在上述实施例中,函数汇聚模块30在实现函数调用汇聚过程中,函数汇聚模块30将所述源程序中位于所述关键路径文件中同一函数关键路径上的函数配置同一代码段标识,并依照同一函数关键路径上函数的调用顺序配置函数在同一代码段中的位置信息;根据所述函数对应的代码段标识及位置信息将所述源程序中对应的函数进行编译后链接在一起。。
本发明实施例通过变量汇聚模块根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内,使得降低全局变量访问跳变,从而减少数据Cache Miss。
图16为本发明提供的编译装置实施例三的结构示意图,如图16所示,本实施例的编译装置包括CPU50、存储器52、通信接口54以及总线53,其中CPU50可用于执行上述计算机程序中热点函数的汇聚方法实施例或者计算机程序中热点全局变量的汇聚方法实施例中的操作步骤,存储器52可用于存储与上述方法实施例中操作步骤对应的程序指令,通信接口54可用于发送或接收相应的程序指令和数据,总线53用于编译装置内部各个功能单元之间的通信。
图17为本发明提供的编译装置实施例四的结构示意图,如图17所示,本实施例的装置包括:获取模块10,用于获取待处理的源程序;路径分析模块20,用于模拟执行所述源程序,并在所述源程序的执行过程中收集所述源程序中每个全局变量的访问信息,以生成关键路径文件,所述关键路径文件包括:执行所述源程序时的一条或多条数据关键路径;其中,数据关键路径用于描述执行所述源程序时的一个或多个热点全局变量,以及热点全局变量的访问顺序;变量汇聚模块40,用于根据所述关键路径文件将所述源程序中位于同一数据关键路径上的热点全局变量依照访问顺序进行编译后链接在同一数据段内。
本实施例的编译装置可实现对源程序中热点全局变量的汇聚,其工作原理及达到的技术效果与上述图13所示方法实施例类似,不再详细赘述。
图18本发明提供的编译装置应用实施例的结构示意图,如图18所示,本实施例的编译装置包括:关键路径分析器以及函数、数据重组器,其中关键路径分析器用于生成关键路径文件,函数、数据重组器用于根据关键路径分析器生成的关键路径文件对源程序中的热点函数及热点全局变量进行编译后链接在一起,生成可执行文件,以使计算机程序执行器执行时减少指令跳变和数据跳变。其中,关键路径分析器的工作过程为:待处理的源程序文件和业务参数作为输入被送到预处理器,预处理器对源程序进行分析,建立函数与数据在源文件间的调用关系,并找到程序的执行入口,将入口信息提交给模拟执行器;模拟执行器进行程序模拟执行并收集每个全局变量的访问信息以及每个函数的调用信息,分析变量与函数的路径,并将生成的原始路径信息记录到存储器中;路径分析器从存储器中读取原始路径信息,并忽略其中占比较小的节点,同时依据从高到低的顺序重排关键路径,并生成关键路径文件。函数、数数据重组器的工作过程为:输入关键路径文件和源程序文件被输入到路径文件识别器,进行合法性判断,并生成段表信息,如图11所示,路径文件识别器将段表信息和源文件提交给编译器,编译器按照段表信息内对指定的符号排列对源文件进行编译,生成目标文件;编译器将目标文件与段表信息传给链接器,链接器按照段表信息指定的函数与全局变量引用顺序合理安排它们在代码段或数据段的位置,生成可执行文件。
图19为本发明提供的计算机程序处理系统实施例的结构示意图,如图19所示,本实施例的系统,包括:程序执行装置200和如上述图14至图18中任一图示的编译装置100,所述程序执行装置200用于执行处理所述编译装置100编译后链接生成的可执行文件。
本发明实施例的计算机程序处理系统可执行上述任一实施例的技术方案,其工作原理及达到的技术效果类似,不再详细赘述。
最后应说明的是:以上实施例仅用以说明本发明的技术方案而非对其进行限制,尽管参照较佳实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对本发明的技术方案进行修改或者等同替换,而这些修改或者等同替换亦不能使修改后的技术方案脱离本发明技术方案的精神和范围。