一种程序代码的热点分析方法与流程

未命名 10-09 阅读:97 评论:0


1.本发明涉及热点分析,具体涉及一种程序代码的热点分析方法。


背景技术:

2.在计算机系统中,计算资源通常极为有限,因此对于深度学习、图像算法等计算密集度较高的领域,需要对程序代码进行深度优化,以提升程序运行效率。
3.程序运行过程中,通常较多的耗时集中在较少的代码段中,一些业务较为集中的程序代码甚至会达到90%以上的耗时集中在10%的代码段中。因此,比较有效的优化方法就是对程序代码进行热点分析,找出耗时较多的代码段,并针对性的对耗时较多的代码段进行深度优化。
4.目前,常见的热点分析工具多是基于linux内核,但是在非linux内核的情况下,缺乏必要的工具对程序代码进行热点分析。针对程序代码进行热点分析时,最常见的方法是在代码段中添加部分代码来计算各代码段运行期的时间戳,然后根据时间戳计算各代码段的运行时间。但是,这种方法存在以下缺点:
5.1)一般添加的耗时统计代码,很难实现基于函数调用图和调用树的统计分析,如果需要进行统计分析则需要大量的全局变量,代码量巨大;
6.2)手动编写耗时统计代码,难以生成内容详尽且清晰的报表,即便生成报表一般情况下也较为简陋并且风格不统一。


技术实现要素:

7.(一)解决的技术问题
8.针对现有技术所存在的上述缺点,本发明提供了一种程序代码的热点分析方法,能够有效克服现有技术所存在的需要使用大量代码,以及难以生成内容详尽且清晰的报表的缺陷。
9.(二)技术方案
10.为实现以上目的,本发明通过以下技术方案予以实现:
11.一种程序代码的热点分析方法,包括以下步骤:
12.s1、启动热点分析,分配内存空间用于保存周期性采样结果;
13.s2、绑定核内定时器事件到指定中断号,并注册对应的中断服务程序;
14.s3、启动核内定时器,核内定时器周期性触发中断,执行中断服务程序;
15.s4、获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判断结果将当前函数的返回地址写入内存;
16.s5、读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果。
17.优选地,s1中启动热点分析,分配内存空间用于保存周期性采样结果,包括:
18.通过目标机提供的sample_start函数接口,启动热点分析;
19.启动热点分析后,通过malloc函数分配一块内存空间,用于保存周期性采样结果。
20.优选地,所述通过目标机提供的sample_start函数接口,启动热点分析,包括:
21.通过以下函数启动热点分析:
22.intsample_start(uint32_tirq,uint32_tsample_time,uint32_tsys_freq)
23.上述函数功能为启动热点分析,在应用程序中进行调用,通过启动核内定时器进行周期性采样,其中,irq为中断优先级,sample_time为采样粒度,sys_freq为当前系统频率。
24.优选地,所述核内定时器的计数值采用下式计算:
25.timer_count_per_sample=(sample_time*1000.0)/(1000000.0/(sys_fre q*1.0))
26.其中,timer_count_per_sample为核内定时器的计数值,sample_time为采样粒度,sys_freq为当前系统频率。
27.优选地,s4中获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判断结果将当前函数的返回地址写入内存,包括:
28.s41、从当前任务栈的栈顶指针u9开始,获取当前函数的返回地址,并判断是否与中断服务程序返回地址相同;
29.s42、若当前函数的返回地址与中断服务程序返回地址不同,则进入s44;
30.s43、若当前函数的返回地址与中断服务程序返回地址相同,则获取进入中断时保存的中断返回地址并写入内存;
31.s44、获取上层函数的栈顶指针u9及对应的返回地址,并回到s41,直至栈顶指针u9到达当前任务栈的栈底。
32.优选地,s43中获取进入中断时保存的中断返回地址并写入内存,包括:
33.进入中断时保存的中断返回地址保存在save_pc_addr中;
34.其中,save_pc_addr为uint32_t类型的全局变量,从堆内存中分配,默认大小为8225,通过sample_memory_size宏自定义内存大小;第一个字记录sample_count,为当前已存储的数据个数,也是下一次采样数据记录的偏移;从第二个字开始,记录每次采样数据,包含数据个数和具体数据。
35.优选地,s5中读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果,包括:
36.上位机读取save_pc_addr中的采样数据,根据entry计算出函数调用栈,根据采样数和采样pc计算出每个函数的运行时间比例,并生成相应报表展示热点分析结果。
37.优选地,s5中读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果之后,还包括:
38.s6、关闭热点分析,解除核内定时器的中断绑定,释放分配内存空间。
39.优选地,s6中关闭热点分析,解除核内定时器的中断绑定,释放分配内存空间,包括:
40.通过目标机提供的sample_stop函数接口,关闭热点分析;
41.解除核内定时器的中断绑定,释放malloc函数分配的内存空间。
42.优选地,所述通过目标机提供的sample_stop函数接口,关闭热点分析,包括:
43.通过以下函数关闭热点分析:
44.voidsample_stop(void)
45.上述函数功能为通过关闭核内定时器停止进行周期性采样,关闭热点分析。
46.(三)有益效果
47.与现有技术相比,本发明所提供的一种程序代码的热点分析方法,能够大幅减少代码量,使用方便,并且可以自定义采样次数,灵活按照实际需求对程序代码进行热点分析,同时热点分析结果以报表形式展示,更加清晰明了,能够详细展示函数之间的调用层级关系及调用次数。
附图说明
48.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
49.图1为本发明的流程示意图。
具体实施方式
50.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
51.一种程序代码的热点分析方法,如图1所示,

启动热点分析,分配内存空间用于保存周期性采样结果,具体包括:
52.通过目标机提供的sample_start函数接口,启动热点分析;
53.启动热点分析后,通过malloc函数分配一块内存空间,用于保存周期性采样结果。
54.具体地,通过目标机提供的sample_start函数接口,启动热点分析,包括:
55.通过以下函数启动热点分析:
56.intsample_start(uint32_tirq,uint32_tsample_time,uint32_tsys_freq)
57.上述函数功能为启动热点分析,在应用程序中进行调用,通过启动核内定时器进行周期性采样,其中,irq为中断优先级,sample_time为采样粒度,sys_freq为当前系统频率。
58.本技术技术方案中,核内定时器的计数值采用下式计算:
59.timer_count_per_sample=(sample_time*1000.0)/(1000000.0/(sys_fre q*1.0))
60.其中,timer_count_per_sample为核内定时器的计数值,sample_time为采样粒度(以ms为单位),sys_freq为当前系统频率(以mhz为单位)。
61.②
绑定核内定时器事件到指定中断号,并注册对应的中断服务程序sample_isr。
62.③
启动核内定时器,核内定时器周期性触发中断,执行中断服务程序sample_isr。
63.④
获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判
断结果将当前函数的返回地址写入内存,具体包括:
64.s41、从当前任务栈的栈顶指针u9开始,获取当前函数的返回地址,并判断是否与中断服务程序返回地址相同;
65.s42、若当前函数的返回地址与中断服务程序返回地址不同,则进入s44;
66.s43、若当前函数的返回地址与中断服务程序返回地址相同,则获取进入中断时保存的中断返回地址并写入内存;
67.s44、获取上层函数的栈顶指针u9及对应的返回地址,并回到s41,直至栈顶指针u9到达当前任务栈的栈底。
68.s43中获取进入中断时保存的中断返回地址并写入内存,包括:
69.进入中断时保存的中断返回地址保存在save_pc_addr中;
70.其中,save_pc_addr为uint32_t类型的全局变量,从堆内存中分配,默认大小为8225,通过sample_memory_size宏自定义内存大小;第一个字记录sample_count,为当前已存储的数据个数(包括第一个字),也是下一次采样数据记录的偏移;从第二个字开始,记录每次采样数据,包含数据个数和具体数据。
71.1)采样数据记录格式如下:
[0072][0073]
其中,stack调用深度kmaxstackdepth默认最大为32。
[0074]
2)采样数据在save_pc_addr中的保存形式如下表所示:
[0075]
表1采样数据在save_pc_addr中的保存形式表
[0076]
sample_countentry.countentry.stack[0]entry.stack[1]

entry.stack[count-1]
[0077]

读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果,具体包括:
[0078]
上位机读取save_pc_addr中的采样数据,根据entry计算出函数调用栈,根据采样数和采样pc计算出每个函数的运行时间比例,并生成相应报表展示热点分析结果。
[0079]

关闭热点分析,解除核内定时器的中断绑定,释放分配内存空间,具体包括:
[0080]
通过目标机提供的sample_stop函数接口,关闭热点分析;
[0081]
解除核内定时器的中断绑定,释放malloc函数分配的内存空间。
[0082]
具体地,通过目标机提供的sample_stop函数接口,关闭热点分析,包括:
[0083]
通过以下函数关闭热点分析:
[0084]
voidsample_stop(void)
[0085]
上述函数功能为通过关闭核内定时器停止进行周期性采样,关闭热点分析。
[0086]
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者
替换,并不会使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

技术特征:
1.一种程序代码的热点分析方法,其特征在于:包括以下步骤:s1、启动热点分析,分配内存空间用于保存周期性采样结果;s2、绑定核内定时器事件到指定中断号,并注册对应的中断服务程序;s3、启动核内定时器,核内定时器周期性触发中断,执行中断服务程序;s4、获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判断结果将当前函数的返回地址写入内存;s5、读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果。2.根据权利要求1所述的程序代码的热点分析方法,其特征在于:s1中启动热点分析,分配内存空间用于保存周期性采样结果,包括:通过目标机提供的sample_start函数接口,启动热点分析;启动热点分析后,通过malloc函数分配一块内存空间,用于保存周期性采样结果。3.根据权利要求2所述的程序代码的热点分析方法,其特征在于:所述通过目标机提供的sample_start函数接口,启动热点分析,包括:通过以下函数启动热点分析:intsample_start(uint32_tirq,uint32_tsample_time,uint32_tsys_freq)上述函数功能为启动热点分析,在应用程序中进行调用,通过启动核内定时器进行周期性采样,其中,irq为中断优先级,sample_time为采样粒度,sys_freq为当前系统频率。4.根据权利要求3所述的程序代码的热点分析方法,其特征在于:所述核内定时器的计数值采用下式计算:timer_count_per_sample=(sample_time*1000.0)/(1000000.0/(sys_fre q*1.0))其中,timer_count_per_sample为核内定时器的计数值,sample_time为采样粒度,sys_freq为当前系统频率。5.根据权利要求2所述的程序代码的热点分析方法,其特征在于:s4中获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判断结果将当前函数的返回地址写入内存,包括:s41、从当前任务栈的栈顶指针u9开始,获取当前函数的返回地址,并判断是否与中断服务程序返回地址相同;s42、若当前函数的返回地址与中断服务程序返回地址不同,则进入s44;s43、若当前函数的返回地址与中断服务程序返回地址相同,则获取进入中断时保存的中断返回地址并写入内存;s44、获取上层函数的栈顶指针u9及对应的返回地址,并回到s41,直至栈顶指针u9到达当前任务栈的栈底。6.根据权利要求5所述的程序代码的热点分析方法,其特征在于:s43中获取进入中断时保存的中断返回地址并写入内存,包括:进入中断时保存的中断返回地址保存在save_pc_addr中;其中,save_pc_addr为uint32_t类型的全局变量,从堆内存中分配,默认大小为8225,通过sample_memory_size宏自定义内存大小;第一个字记录sample_count,为当前已存储的数据个数,也是下一次采样数据记录的偏移;从第二个字开始,记录每次采样数据,包含
数据个数和具体数据。7.根据权利要求6所述的程序代码的热点分析方法,其特征在于:s5中读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果,包括:上位机读取save_pc_addr中的采样数据,根据entry计算出函数调用栈,根据采样数和采样pc计算出每个函数的运行时间比例,并生成相应报表展示热点分析结果。8.根据权利要求7所述的程序代码的热点分析方法,其特征在于:s5中读取内存中的地址,根据程序pc地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果之后,还包括:s6、关闭热点分析,解除核内定时器的中断绑定,释放分配内存空间。9.根据权利要求8所述的程序代码的热点分析方法,其特征在于:s6中关闭热点分析,解除核内定时器的中断绑定,释放分配内存空间,包括:通过目标机提供的sample_stop函数接口,关闭热点分析;解除核内定时器的中断绑定,释放malloc函数分配的内存空间。10.根据权利要求9所述的程序代码的热点分析方法,其特征在于:所述通过目标机提供的sample_stop函数接口,关闭热点分析,包括:通过以下函数关闭热点分析:voidsample_stop(void)上述函数功能为通过关闭核内定时器停止进行周期性采样,关闭热点分析。

技术总结
本发明涉及热点分析,具体涉及一种程序代码的热点分析方法,启动热点分析,分配内存空间用于保存周期性采样结果;绑定核内定时器事件到指定中断号,并注册对应的中断服务程序;启动核内定时器,核内定时器周期性触发中断,执行中断服务程序;获取当前函数的返回地址,判断是否与中断服务程序返回地址相同,并根据判断结果将当前函数的返回地址写入内存;读取内存中的地址,根据程序PC地址获得所执行的函数信息,分析当前程序的热点代码片段,并展示热点分析结果;本发明提供的技术方案能够有效克服现有技术所存在的需要使用大量代码,以及难以生成内容详尽且清晰的报表的缺陷。难以生成内容详尽且清晰的报表的缺陷。难以生成内容详尽且清晰的报表的缺陷。


技术研发人员:陈双厚 邹文静 朱艳 陈金忠
受保护的技术使用者:安徽芯纪元科技有限公司
技术研发日:2023.07.10
技术公布日:2023/10/7
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐