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

一种基于热力图的热点代码优化方法及装置与流程

2022-03-09 10:19:32 来源:中国专利 TAG:


1.本发明涉及软件开发技术领域,具体涉及一种基于热力图的热点代码优化方法及装置。


背景技术:

2.在科学计算类程序中,通常包含复杂的逻辑处理过程和大量的数值处理算法,导致其运行速度受到影响;为了提高程序的运行效率,有时需要对已经完成的程序代码进行优化,通过对数据存储方式、程序处理逻辑等部分的优化,达到提高程序运行效率的目的。
3.针对全部代码进行优化固然是一个好方法,但是耗时费力;如果能快速准确地分析出程序中耗费时间最多、执行最频繁的热点函数和热点代码,并对其进行优化,会达到事半功倍的效果。
4.通过执行典型的测试算例的方式来得到各函数的执行时间和被调用次数,从而确定出热点代码的方法是一种可行的方法,但是存在不直观的问题;热力图是一种以可视化方式反映一个区域的受关注程度、显著程度或者活跃程度的方法,将其用在热点代码的寻找、代码优化后的比较过程中,将为代码优化提供可视化参考。
5.为了更好地完成科学计算类程序的代码优化工作,本发明提供一种基于热力图的热点代码优化方法及装置。


技术实现要素:

6.本发明所要解决的技术问题是:现有反应堆系统软件热点代码优化方法,主要针对全部代码进行优化,耗时费力,而通过测试算例或算法的优化,只能体现出宏观效果,其内部代码的受关注度及活跃程度不具有直观性,本发明目的在于提供一种基于热力图的热点代码优化方法及装置,以解决上述技术问题。
7.本发明通过下述技术方案实现:
8.本方案提供一种基于热力图的热点代码优化方法,包括:
9.步骤一:使用测试算例集执行程序,并统计各函数的执行时间平均值和调用次数;
10.步骤二:将各函数的执行时间平均值作为热力值,绘制函数调用热力图;
11.步骤三:基于函数调用热力图确定热点函数和热点代码;
12.步骤四:对照代码优化检查单,对热点函数和热点代码进行检查并尝试优化。
13.本方案工作原理:现有反应堆系统软件热点代码优化方法,主要针对全部代码进行优化,耗时费力,而通过测试算例或算法的优化,只能体现出宏观效果,其内部代码的受关注度及活跃程度不具有直观性;为了更好地完成科学计算类程序的代码优化工作,本发明提供了一种基于热力图的热点代码优化方法,将函数执行的平均时间作为热力值并绘制函数调用热力图,热力图的可视化显示为寻找热点函数提供了直观的依据;在确定出热点函数和热点代码后,提供代码优化检查单,再依据代码优化检查单,对热点函数和热点代码逐个进行检查、分析,并尝试优化;在优化后重新执行测试算例来检查优化的效果,可以较
为快捷地完成代码优化工作;
14.现有技术有对全部代码进行检查和优化,但是这需要耗费大量时间并占用较大宽带,本方案从全部代码中筛选出热点代码,只对热点函数的代码和进行优化,目标明确,不仅实现从微观方面对代码进行优化,同时节约优化占用宽带并提高计算速率;
15.对于核反应堆系统来说,需要系统内各个软件具有较好的执行效率和性能,就需要对宏观算法进行优化或者对热点代码进行优化以提升执行效率,而宏观算法进行优化过程只能从宏观方面进行提升,对于与性能有关的内部代码活跃度、受关注度等信息无法及时掌握,本方案实现在现有反应堆系统软件热点代码优化中,自动寻找热点,可视化展现热点代码,实现代码优化,提升软件执行效率和性能。
16.进一步优化方案为,步骤一具体包括:
17.使用已经编制好的测试算例集中的测试算例分别执行程序;
18.再统计测试算例执行程序过程中各函数的执行时间,并计算出执行时间的算术平均值;
19.所述函数的执行时间为程序运行时该函数被调用的全部运行时间的总和。
20.进一步优化方案为,当运行第一函数还需要调用其他函数时,其他函数的执行时间不统计在第一函数的被调用时间内。
21.进一步优化方案为,函数调用热力图绘制方法为:
22.对各函数进行编号;
23.在直角坐标内,将各函数的序号作为x轴,将各函数的执行时间的算术平均值作为y轴,y值即为热力值;
24.将x值与y值的交叉点作为函数的值点;
25.将各函数的值点用直线连接得到的折线即为函数调用热力图。将函数执行的平均时间作为热力值并绘制函数调用热力图,热力图的可视化显示为寻找热点函数提供了直观的依据。
26.进一步优化方案为,热点函数和热点代码的确定方法为:
27.根据函数调用热力图中函数的总数设置一个热力阈值范围,将该热力阈值范围的热力值按照从大到小的顺序确定为热点函数;
28.热点函数包含的所有代码确定为热点代码。
29.进一步优化方案为,热点函数和热点代码的确定方法为:直接选取函数调用热力图中热力值最大的函数为热点函数,热点函数包含的所有代码确定为热点代码。
30.进一步优化方案为,当只确定出一组热点函数时,执行完步骤四后返回步骤三,再按函数调用热力图中热力值顺序确定新的热点函数,循环执行步骤三和步骤四直至遍历所有热点函数。
31.进一步优化方案为,所述代码优化检查单包括:
32.a.若某函数的调用次数远大于其余函数,检查是否可以减少该函数的参数个数;并检查是否可以作为内联函数;根据代码优化检查单检验结果相应的减少该函数的参数个数或作为内联函数。
33.b.若某函数的调用次数远大于其余函数,检查该函数内是否有申请和释放内存的操作,若有,检查是否可以在该函数体外申请内存;根据代码优化检查单检验结果相应的申
请和释放内存的操作,或在该函数体外申请内存。
34.c.若函数体内频繁地按某一顺序访问某一个变量空间中的各个值,检查该变量的存储空间是否可以用指针进行连续访问;根据代码优化检查单检验结果相应的优化用指针进行连续访问。
35.d.若函数体内包含多重循环,检查该函数里层的代码是否包含判断;若有,检查该判断是否与循环变量有关或与上一次循环运算有关;若无关,检查是否可将该判断放入循环体的外部;根据代码优化检查单检验结果相应的进行将该判断放入循环体的外部优化处理。
36.e.若函数体内包含多重循环和对多维数组的访问,检查多重循环的顺序与多维数组的下标顺序是否对应,若不对应,则将其调整为顺序对应。
37.进一步优化方案为,还包括:
38.步骤五:执行完步骤四后,重新执行步骤一至步骤三,再基于对照代码优化检查单,对整个测试算例集确定的热点函数和热点代码进行检查并优化,或对单个的测试算例确定的热点函数或热点代码热点进行优化。
39.本方案还提供一种基于热力图的热点代码优化装置,应用于上述的方法,包括:执行统计模块、绘制模块、确定模块和优化模块;
40.所述执行统计模块使用测试算例集执行程序,并统计各函数的执行时间平均值和调用次数;
41.所述绘制模块将各函数的执行时间平均值作为热力值,绘制函数调用热力图;
42.所述确定模块基于函数调用热力图确定为热点函数和热点代码;
43.所述优化模块对照代码优化检查单,对热点函数和热点代码进行检查并尝试优化。本发明与现有技术相比,具有如下的优点和有益效果:
44.本发明提供的本发明提供了一种基于热力图的热点代码优化方法,将函数执行的平均时间作为热力值并绘制函数调用热力图,热力图的可视化显示为寻找热点函数提供了直观的依据;在确定出热点函数和热点代码后,提供代码优化检查单,再依据代码优化检查单,对热点函数和热点代码逐个进行检查、分析,并尝试优化;在优化后重新执行测试算例来检查优化的效果,可以较为快捷地完成代码优化工作;只对热点函数的代码和进行优化,目标明确,不仅实现从微观方面对代码进行优化,同时节约优化占用宽带并提高计算速率。
附图说明
45.为了更清楚地说明本发明示例性实施方式的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。在附图中:
46.图1为基于热力图的热点代码优化方法流程示意图;
47.图2为施例3测试算例运行后的情况统计图;
48.图3为实施例3测试算例运行后获得的函数调用热力图。
具体实施方式
49.为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。
50.现有反应堆系统软件热点代码优化方法,主要针对全部代码进行优化,耗时费力,而通过测试算例或算法的优化,只能体现出宏观效果,其内部代码的受关注度及活跃程度不具有直观性,鉴于此,本发明提供以下实施例以解决上述问题;
51.实施例1
52.本实施例提供一种基于热力图的热点代码优化方法,包括:
53.步骤一:使用测试算例集执行程序,并统计各函数的执行时间平均值和调用次数;
54.步骤二:将各函数的执行时间平均值作为热力值,绘制函数调用热力图;
55.步骤三:基于函数调用热力图确定热点函数和热点代码;
56.步骤四:对照代码优化检查单,对热点函数和热点代码进行检查并尝试优化;
57.步骤五:执行完步骤四后,重新执行步骤一至步骤三,再基于对照代码优化检查单,对整个测试算例集确定的热点函数和热点代码进行检查并优化,或对单个的测试算例确定的热点函数或热点代码热点进行优化。
58.步骤一具体包括:
59.使用已经编制好的测试算例集中的测试算例分别执行程序;
60.再统计测试算例执行程序过程中各函数的执行时间,并计算出执行时间的算术平均值;
61.所述函数的执行时间为程序运行时该函数被调用的全部运行时间的总和。
62.当运行第一函数还需要调用其他函数时,其他函数的执行时间不统计在第一函数的被调用时间内。
63.函数调用热力图绘制方法为:
64.对各函数进行编号;
65.在直角坐标内,将各函数的序号作为x轴,将各函数的执行时间的算术平均值作为y轴,y值即为热力值;
66.将x值与y值的交叉点作为函数的值点;
67.将各函数的值点用直线连接得到的折线即为函数调用热力图。
68.热点函数和热点代码的确定方法为:
69.根据函数调用热力图中函数的总数设置一个热力阈值范围,将该热力阈值范围的热力值按照从大到小的顺序确定为热点函数;
70.热点函数包含的所有代码确定为热点代码。
71.热点函数和热点代码的确定方法为:直接选取函数调用热力图中热力值最大的函数为热点函数,热点函数包含的所有代码确定为热点代码。
72.当只确定出一组热点函数时,执行完步骤四后返回步骤三,再按函数调用热力图中热力值顺序确定新的热点函数,循环执行步骤三和步骤四直至遍历所有热点函数。
73.所述代码优化检查单包括:
74.a.若某函数的调用次数远大于其余函数,检查是否可以减少该函数的参数个数;
并检查是否可以作为内联函数;根据代码优化检查单检验结果相应的减少该函数的参数个数或作为内联函数。
75.b.若某函数的调用次数远大于其余函数,检查该函数内是否有申请和释放内存的操作,若有,检查是否可以在该函数体外申请内存;根据代码优化检查单检验结果相应的申请和释放内存的操作,或在该函数体外申请内存。
76.c.若函数体内频繁地按某一顺序访问某一个变量空间中的各个值,检查该变量的存储空间是否可以用指针进行连续访问;根据代码优化检查单检验结果相应的优化用指针进行连续访问。
77.d.若函数体内包含多重循环,检查该函数里层的代码是否包含判断;若有,检查该判断是否与循环变量有关或与上一次循环运算有关;若无关,检查是否可将该判断放入循环体的外部;根据代码优化检查单检验结果相应的进行将该判断放入循环体的外部优化处理。
78.e.若函数体内包含多重循环和对多维数组的访问,检查多重循环的顺序与多维数组的下标顺序是否对应,若不对应,则将其调整为顺序对应。
79.实施例2
80.本实施例提供一种基于热力图的热点代码优化装置,应用于上一实施例所述的方法,包括:执行统计模块、绘制模块、确定模块和优化模块;
81.所述执行统计模块使用测试算例集执行程序,并统计各函数的执行时间平均值和调用次数;
82.所述绘制模块将各函数的执行时间平均值作为热力值,绘制函数调用热力图;
83.所述确定模块基于函数调用热力图确定为热点函数和热点代码;
84.所述优化模块对照代码优化检查单,对热点函数和热点代码进行检查并尝试优化。
85.实施例3
86.为了更加清楚地展示本发明的目的和技术方案,本实施例将结合具体的实施过程对上述具体实施方式和参数进行更加详细的描述。
87.基于热力图的热点代码优化方法,包括以下步骤:
88.步骤1,使用测试算例集来执行程序,统计得到各函数的执行时间的平均值和调用次数。设待测软件包括5个函数,分别为f1-f5;测试算例集执行后的平均情况如图2所示,时间单位为秒。
89.步骤2,将函数的执行时间平均值作为热力值,绘制函数调用热力图。本实施例获得的函数调用热力图如图3所示。
90.步骤3,取函数调用热力图中热力值较大的函数,确定为热点函数。
91.根据图3可以直观地得出函数f5和f4是热点函数的结论;我们这里挑选了2个函数,为总函数个数的40%;实际情况中可以设定为总函数个数的5%~40%的范围,并根据实际情况调整。也可以先挑选热力值最大的函数f5作为热点函数,在对其进行优化检查和尝试后,再将函数f4确定类热点函数并进行优化检查和尝试。
92.步骤4,对照代码优化检查单,对热点函数和热点代码进行检查并优化;
93.检查单1,若某函数的调用次数远大于其余函数,检查是否可以减少该函数的参数
个数;并检查是否可以作为内联函数。这里的远大于指一个比例,如可设为10,如函数f5的被调用次数为50000,函数f4的被调用次数为40000,其余4个函数的被调用次数最大值为200,则函数f5和函数f4的被调用次数大于其余函数被调用次数最大值的10倍,满足远大于这一要求。
94.可选地,这里的远大于也可以设置为一个具体的值,如十万次;只要函数的执行次数大于这个值,就可以视为远大于并进行优化检查和尝试。
95.函数f5的调用次数为50000,可以考虑优化函数的参数。
96.本例中的代码均以c语言为例,设函数f5的原型为:
97.int f5(int x1,double x2,float x3,int*x4,double*x2,float*x6);
98.则可以考虑将这些参数放入一个结构体,然后将这个结构体指针作为函数参数:
99.struct para{int x1;double x2;float x3,int*x4;double*x2;float*x6};
100.将函数f5的原型修改为:
101.int f5(struct para*);
102.这样在调用该函数时,参数从6个减少为1个,大大减少了调用参数时的入栈和出栈开销;一般而言,当函数调用次数大于万次时,该优化将有明显的效果;若该函数代码简单时,将该函数修改inline内联函数,也可以达到同样的效果。
103.检查单2,若函数的调用次数远大于其余函数,检查函数内是否有申请和释放内存的操作,若有,检查是否可以在函数体外申请内存。
104.若函数体内有申请内存和释放内存的操作,设函数的部分代码为:
[0105][0106]
调用处的代码为:
[0107]
for(int i=0;i《1000;i )f5(100,3.2);
[0108]
则优化后的代码为:
[0109]
int f5(int x1,double x2,double&*x3){other codes;}
[0110]
调用处的代码修改为:
[0111]
double*x3=(double*)malloc(100*sizeof(double));
[0112]
for(int i=0;i《1000;i )f5(100,3.2,x3);
[0113]
free(x3);
[0114]
这样在函数外申请和释放内存并将内存地址传入函数,只需要申请和释放内存一次;
[0115]
当函数的调用次数即这个for循环的循环次数大于一万时,该优化将有的显著效果。
[0116]
检查单3,若函数体内频繁访问某一个变量,检查变量的存储空间是否可以用指针进行连续访问。
[0117]
假设函数体内使用了下标对数组进行访问,代码如下:
[0118]
for(int i=0;i《10000;i )a[i]=b*a[i];
[0119]
该处代码可以优化为:
[0120][0121]
这样使用指针访问连续的内存空间时,效率大于直接用下标访问;
[0122]
在for循环的循环次数大于一万时,该优化会有明显的效果。
[0123]
检查单4,若函数体内包含多重循环,检查里层的代码是否包含判断;若有,检查该判断是否与循环变量有关或与上一次循环运算有关;如无关,检查是否可将该判断放入循环体的外部。
[0124]
假设函数体内包括如下代码:
[0125][0126]
该处代码可以优化为:
[0127][0128]
上述优化将减少上百万次的逻辑判断;
[0129]
当上述循环次数达到十万次以上时,优化将有明显的效果。
[0130]
检查单5,若函数体内包含多重循环和对多维数组的访问,检查多重循环的顺序与
多维数组的下标顺序是否对应,若不对应,则尝试将其调整为顺序对应。
[0131]
假设函数体内包括如下代码:
[0132][0133]
则可以优化为
[0134][0135]
上述优化使循环变量的顺序与下标存储顺序一致,其访问效率将有一定的提升;
[0136]
注意如果是fortran语言编写的代码,则上述顺序需要相反而不是一致。
[0137]
步骤5,优化完成,重新执行测试算例集,对比分析检查优化的效果。
[0138]
上述代码优化结束后,需要重新执行相应的测试算例,或者测试算例集中全部算例,以便对优化的效果进行检查。
[0139]
最后应说明的是,以上实施例仅用以说明本发明的技术方案,而非对其进行限制;尽管前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解,通过对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换,或者修改各个步骤的顺序,而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围;本发明中各种阈值及范围的取值,也会因为具体情况不同而有所改变。
[0140]
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

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

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

相关文献