本发明专利技术涉及一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法。本发明专利技术包括:在目标接口函数的适当位置植入数据索引机制;获取目标数据的标识常量并调用哈希函数计算标识常量的哈希值;根据哈希值在内建哈希表查找目标表项,如存在则直接返回目标数据地址;根据目标数据常量标识,调用原系统函数查找目标数据,如找到则将目标数据以及其标识常量的哈希值插入内建哈希表中并正确返回;否则抛出异常并返回。采用本发明专利技术所提供的优化技术方案对JNI机制接口函数GetMethodID、GetStaticMethodID进行优化后,性能表现全面优于原接口函数,性能提升幅度较大,在一定程度上可以提高Dalvik虚拟机整体性能。
【技术实现步骤摘要】
—种基于Da IV i k虚拟机JNI机制中接口函数性能优化方法
[0001 ] 本专利技术涉及一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法。
技术介绍
Android是由Google公司基于移动设备而开发的嵌入式系统,具有优良的性能表现以及较低的硬件配置需求,因此迅速成为目前移动终端之上的主流操作系统。这种优势的体现主要得益于Google对作为Android系统基石的Dalvik虚拟机所做出的大量优化。实际上,Dalvik虚拟机并不是一个标准的Java虚拟机,因为它并不符合标准Java虚拟机设计规范。Dalvik虚拟机是一个针对嵌入式系统中低速CPU和内存受限的等特点,经过专门设计优化而实现的Java语言虚拟机。JNI机制的英文全称为Java Native Interface,是SUN公司所定义的一套编程框架标准接口,用于实现Java代码和本地代码互相调用的需求。本地代码是指那些使用Java语言之外的编程语言编写的代码,与本地硬件平台相关。在Android系统中,由Dalvik虚拟机实现了这套接口,供Dalvik虚拟机的Java应用与本地代码实现互相调用,使Java应用的执行效率得到了很大提高。即便如此,在使用本地调用机制编写应用程序的时候,除了本地代码执行的高效性带来的优点之外,Dalvik虚拟机在Java代码和本地代码互相调用过程中也付出了额外的开销。尤其是当本地函数需要多次访问Java类中的同一个函数时,每次调用JNI接口函数都会执行同样的查找工作以获得对应的MethodID数据。事实上,这些重复的冗余操作是可以避免的。
技术实现思路
本专利技术的目的在于提供一种提高Dalvik虚拟机整体性能的基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法。本专利技术的目的是这样实现的:(I)在目标接口函数的适当位置植入数据索引机制;(2)获取目标数据的标识常量并调用哈希函数计算标识常量的哈希值;( 3 )根据哈希值在内建哈希表查找目标表项,如存在则直接返回目标数据地址,否则实施步骤(4);(4)根据目标数据常量标识,调用原系统函数查找目标数据,如找到则将目标数据以及其标识常量的哈希值插入内建哈希表中并正确返回;否则抛出异常并返回。步骤(I)中目标接口函数适当位置是指:对于GetMethodID函数,适当位置为GetMethodID 函数调用 dvmFindVirtualMethodHierByDescriptor 函数对目标 MethodID查找之前,在此处引入一个数据索引机制;对于GetStaticMethodID函数,适当位置为 GetStaticMethodID 函数调用 dvmFindDirectMethodHierByDescriptor 函数对目标MethodID查找之前。步骤(2)中目标数据的标识常量是指目标方法所属类的描述符、目标方法名以及签名数据;其中计算标识常量的哈希值是指,调用Dalvik虚拟机提供的哈希函数计算目标数据标识常量字符串哈希值。步骤(3)中内建哈希表是指,一个哈希表数据结构HashTable,每一个哈希单元包括三个成员变量,分别用于存储标识常量的哈希值、标识常量的字符拼接以及目标方法的MethodID。步骤(3)中根据该哈希值在内建哈希表查找目标表项是指,根据步骤21)中生成的哈希值在内建哈希表中查找匹配目标表项并返回目标方法的MethodID。步骤(4)中根据目标数据常量标识,调用原系统函数查找目标数据是指,当步骤(3)的返回值为空时,接口函数将会调用原系统函数并根据目标数据常量标识查找目标方法的MethodID,其中对于接口函数GetMethodID,原系统函数为dvmFindVirtualMethodHierByDescriptor 函数;对于接口 与函数GetStaticMethodID,原系统函数为 dvmFindDirectMethodHierByDescriptor 函数。步骤(4)将目 标数据以及其标识常量的哈希值插入内建哈希表是指,当步骤(3)返回值为空时,接口函数GetMethodID或GetStaticMethodID通过原系统函数查找到目标方法的MethodID数据后,将MethodID数据和与之对应的常量标识以及常量标识的哈希值插入内建哈希表中。专利技术的有益效果在于:在实施过程中发现,采用本专利技术所提供的优化技术方案对JNI机制接口函数GetMethodID^GetStaticMethodID进行优化后,性能表现全面优于原接口函数,性能提升幅度较大,在一定程度上可以提高Dalvik虚拟机整体性能,专利技术有益效果十分之明显。【附图说明】图1为原接口函数执行流程概况图;图2为改进后接口函数执行流程概况图;图3 为原 GetMethodID 和 GetStaticMethodID 接口 函数执行流程;图4为改进后的GetMethodID和GetStaticMethodID接口函数执行流程;图5为GetMethodID和GetMethodIDhs执行时间随函数数量变化图;图6为GetStaticMethodID和GetStaticMethodIDhs执行时间随静态函数数量变化图;图7为优化前后的本地调用接口函数执行时间。【具体实施方式】下面结合附图对本专利技术做进一步描述。基于Dalvik虚拟机的JNI机制中的两个接口函数GetMethodID和GetStaticMethodID在执行查找目标方法MethodID数据时,由于无法将已被查到的数据进行持久化保存,因此该接口函数会根据虚拟机的执行需要可能会对某一数据进行多次的查找操作,这就造成大量冗余的查找操作,在一定程度上影响了 Dalvik虚拟机的执行效率。同时,在查找的过程中需要遍历目标方法所属Java类的方法表,当Java类中方法数较多时,性能的消耗也相应更多。本专利技术正是针对这一问题,公开了一种基于Dalvik虚拟机JNI机制的性能优化技术方案。该技术方案在目标功能接口原有工作流程的基础上,在其中某一恰当位置引入一个采用哈希散列技术实现的数据索引机制,使得在不改变目标接口功能的前提下,将已被查找过的数据保存在一个内建哈希表中,当该数据再次被查找时,将会中内建哈希表中直接取用,避免再次调用相关的查找函数执行查找操作。通过实施这种方案,可以有效地消除GetMethodID和GetStaticMethodID接口函数在执行过程中所在的大量冗余操作,大幅度提高了其性能表现。实验表明,采用本技术方案对上述两个接口函数进行优化后,性能提升幅度可达近35%。该技术解决方案的工作可以划分为以下三个步骤:步骤1:获取目标数据的标识常量并调用哈希函数计算该标识常量的哈希值;步骤2:根据该哈希值在内建哈希表查找目标表项,如存在则直接返回目标数据地址,否则实施步骤3;步骤3:根据目标数据常量标识,调用原系统函数查找目标数据,如找到则将目标数据以及其标识常量的哈希值插入内建哈希表中并正确返回;否则抛出异常并返回。在本专利技术中所涉及的一类JNI接口函数的主要功能为:当本地函数访问Java类方法时本文档来自技高网...
【技术保护点】
一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法,其特征在于:(1)在目标接口函数的适当位置植入数据索引机制;(2)获取目标数据的标识常量并调用哈希函数计算标识常量的哈希值;(3)根据哈希值在内建哈希表查找目标表项,如存在则直接返回目标数据地址,否则实施步骤(4);(4)根据目标数据常量标识,调用原系统函数查找目标数据,如找到则将目标数据以及其标识常量的哈希值插入内建哈希表中并正确返回;否则抛出异常并返回。
【技术特征摘要】
1.一种基于 Dalvik 虚拟机 JNI 机制中接 口 函数 GetMethodID 和 GetStaticMethodID性能优化方法,其特征在于: (1)在目标接口函数的适当位置植入数据索引机制; (2)获取目标数据的标识常量并调用哈希函数计算标识常量的哈希值; (3 )根据哈希值在内建哈希表查找目标表项,如存在则直接返回目标数据地址,否则实施步骤(4); (4)根据目标数据常量标识,调用原系统函数查找目标数据,如找到则将目标数据以及其标识常量的哈希值插入内建哈希表中并正确返回;否则抛出异常并返回。2.根据权利要求1所述的一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法,其特征在于:所述步骤(I)中目标接口函数适当位置是指:对于GetMethodID函数,适当位置为GetMethodID函数调用dvmFindVirtualMethodHierByDescriptor函数对目标MethodID查找之前,在此处引入一个数据索引机制;对于GetStaticMethodID 函数,适当位置为 GetStaticMethodID 函数调用 dvmFindDirectMethodHierByDescriptor函数对目标MethodID查找之前。3.根据权利要求1所述的一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStaticMethodID性能优化方法,其特征在于:所述步骤(2)中目标数据的标识常量是指目标方法所属类的描述符、目标方法名以及签名数据;其中计算标识常量的哈希值是指,调用Dalvik虚拟机提供的哈希函数计算目标数据标识常量字符串哈希值。4.根据权利要求1所述的一种基于Dalvik虚拟机JNI机制中接口函数GetMethodID和GetStatic...
【专利技术属性】
技术研发人员:吴艳霞,张国印,谢东良,许圣明,王彦彰,
申请(专利权)人:哈尔滨工程大学,
类型:发明
国别省市:黑龙江;23
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。