CN108021370A - 字节码的优化方法、装置、存储介质、处理器及终端 - Google Patents
字节码的优化方法、装置、存储介质、处理器及终端 Download PDFInfo
- Publication number
- CN108021370A CN108021370A CN201711431847.5A CN201711431847A CN108021370A CN 108021370 A CN108021370 A CN 108021370A CN 201711431847 A CN201711431847 A CN 201711431847A CN 108021370 A CN108021370 A CN 108021370A
- Authority
- CN
- China
- Prior art keywords
- bytecode
- instruction
- function
- section
- byte
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种字节码的优化方法、装置、存储介质、处理器及终端。该方法包括:获取待优化函数;解析待优化函数,得到函数字节码;分析函数字节码,得到与函数调用关联的第一字节码段;替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,其中,父函数为调用操作的执行主体,子函数为调用操作的执行对象。本发明解决了相关技术中所提供的Python程序运行性能的优化方案复杂度较高、实用性较差、性能提升有限的技术问题。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种字节码的优化方法、装置、存储介质、处理器及终端。
背景技术
Python是一种面向对象、解释型的常用计算机编程语言,其以语法优雅、开发迅速、支持动态类型、丰富的标准库等优点著称,因此在不同领域均得到广泛应用。在游戏开发过程中,其主要作为业务逻辑层脚本语言加以使用。然而,在实际项目开发中,Python语言的缺点也十分显著,其中,最大的问题之一便是运行速度缓慢。许多使用Python语言开发的项目在中后期阶段由于业务逻辑日益复杂,计算负荷加重,很容易达到性能瓶颈。经过分析发现,造成这种现象的原因在于:Python解释器本身的设计缺陷。Python语言诞生于上个世纪,当时采纳的许多设计理念已经不适用于当今的硬件条件。在实际使用Python语言的项目研发中,通常需要安排专门的人力去优化程序代码,导致部分生产力浪费在程序优化工作上。
Python解释器在执行程序时,首先将源代码编译为字节码,再利用Python虚拟机加载编译后的字节码执行。基于虚拟机的技术一方面可以实现语言的跨平台特性,另一方面可以实现动态类型支持。相关技术中所提供的字节码优化方案主要可以包括以下几个步骤:
第一步、通过函数开销统计工具(例如:cProfile)统计一段时间内,执行不同函数所消耗的时间。
第二步、针对执行时间较长的函数,分析该函数的源代码,查找存在性能瓶颈的代码。
第三步、修改存在性能瓶颈的代码,以提升程序性能。
第四步、将修改存在性能瓶颈的代码之前的执行开销与修改存在性能瓶颈的代码之后的执行开销进行对比,验证存在性能瓶颈的代码修改是否生效。如果修改未生效,则重复上述步骤,直到程序性能达到运行要求。
基于前述步骤,当定位到存在性能瓶颈的代码时,相关技术中还提供了如下几种优化方案,但这些优化方案大多是基于语言层做出的改进:
方案一、通过修改Python的写法来实现对Python语言的优化。此种方案的缺陷在于:需要逐行手动修改源代码,并且提升的性能效果有限。
方案二、Python源码的C++化来实现对Python语言的优化。该方案虽然可以极大地提升程序运行效率,但是其缺陷在于:开发效率低,难以抽象出适合C++化的代码,且失去了Python的动态类型特性,丧失了Python的热更新机制。一旦需要修改源代码,便需要重新编译成C++进行发布,成本消耗巨大。因此,这种优化方案只适合业务逻辑已经固定的项目。
方案三、通过即时编译技术(Just in time,简称为JIT)来实现对Python语言的优化。但是,对于特定平台而言,目前苹果IOS系统不支持JIT,开启JIT会导致进程被操作系统结束。安卓系统尽管支持JIT,但是需要解释器支持进阶精简指令集机器(ARM)架构的跨平台编译,维护成本较高,且目前Pyston等开源JIT解释器实现已停止维护或对于ARM架构支持有限。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明至少部分实施例提供了一种字节码的优化方法、装置、存储介质、处理器及终端,以至少解决相关技术中所提供的Python程序运行性能的优化方案复杂度较高、实用性较差、性能提升有限的技术问题。
根据本发明其中一实施例,提供了一种字节码的优化方法,包括:
获取待优化函数;解析待优化函数,得到函数字节码;分析函数字节码,得到与函数调用关联的第一字节码段;替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,其中,父函数为调用操作的执行主体,子函数为调用操作的执行对象。
可选地,分析函数字节码,得到第一字节码段包括:在函数字节码中查找函数调用指令字节码;按照调用指令字节码确定第一字节码段。
可选地,替换第一字节码段中的第二字节码段包括:确定子函数的第三字节码段中存在第一类指令,其中,第一类指令中未携带参数;依据第一类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,替换第一字节码段中的第二字节码段包括:确定子函数的第三字节码段中存在第二类指令,其中,第二类指令中携带有预先定义的参数;依据第二类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,替换第一字节码段中的第二字节码段包括:确定子函数的第三字节码段中存在第三类指令,其中,第三类指令中携带有指向预设元组的参数;依据第三类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整预设元组内对象的索引位置。
可选地,替换第一字节码段中的第二字节码段包括:确定子函数的第三字节码段中存在第四类指令,其中,第四类指令中携带有指示待跳转字节位置的参数;依据第四类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整待跳转字节位置。
可选地,替换第一字节码段中的第二字节码段包括:确定子函数的第三字节码段中存在第五类指令,其中,第五类指令用于返回执行结果;当第五类指令的接续指令为父函数中待执行的指令时,采用第三字节码段替换第二字节码段,并删除第五类指令;或者,当第五类指令的接续指令为其他子函数中待执行的指令时,采用第三字节码段替换第二字节码段,并继续执行父函数中待执行的指令。
根据本发明其中一实施例,还提供了一种字节码的优化装置,包括:
获取模块,用于获取待优化函数;解析模块,用于解析待优化函数,得到函数字节码;分析模块,用于分析函数字节码,得到与函数调用关联的第一字节码段;优化模块,用于替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,其中,父函数为调用操作的执行主体,子函数为调用操作的执行对象。
可选地,分析模块包括:查找单元,用于在函数字节码中查找函数调用指令字节码;确定单元,用于按照调用指令字节码确定第一字节码段。
可选地,优化模块包括:第一确定单元,用于确定子函数的第三字节码段中存在第一类指令,其中,第一类指令中未携带参数;第一优化单元,用于依据第一类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,优化模块包括:第二确定单元,用于确定子函数的第三字节码段中存在第二类指令,其中,第二类指令中携带有预先定义的参数;第二优化单元,用于依据第二类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,优化模块包括:第三确定单元,用于确定子函数的第三字节码段中存在第三类指令,其中,第三类指令中携带有指向预设元组的参数;第三优化单元,用于依据第三类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整预设元组内对象的索引位置。
可选地,优化模块包括:第四确定单元,用于确定子函数的第三字节码段中存在第四类指令,其中,第四类指令中携带有指示待跳转字节位置的参数;第四优化单元,用于依据第四类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整待跳转字节位置。
可选地,优化模块包括:第五确定单元,用于确定子函数的第三字节码段中存在第五类指令,其中,第五类指令用于返回执行结果;第五优化单元,用于当第五类指令的接续指令为父函数中待执行的指令时,采用第三字节码段替换第二字节码段,并删除第五类指令;或者,当第五类指令的接续指令为其他子函数中待执行的指令时,采用第三字节码段替换第二字节码段,并继续执行父函数中待执行的指令。
根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述字节码的优化方法。
根据本发明其中一实施例,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述字节码的优化方法。
根据本发明其中一实施例,还提供了一种终端,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序用于执行上述字节码的优化方法。
在本发明至少部分实施例中,采用对待优化函数进行解析以得到函数字节码,并对函数字节码进行分析以得到与函数调用关联的第一字节码段的方式,通过替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,该父函数为调用操作的执行主体,子函数为调用操作的执行对象,达到了在现有的代码层优化基础上,通过分析函数调用关系并通过函数内联展开方式对函数调用开销进行优化,以进一步提升Python程序运行性能的目的,从而实现了在字节码级别显著地提升函数执行效率的技术效果,进而解决了相关技术中所提供的Python程序运行性能的优化方案复杂度较高、实用性较差、性能提升有限的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明其中一实施例的字节码的优化方法的流程图;
图2是根据本发明其中一优选实施例的字节码函数内联优化过程的流程图;
图3是根据本发明其中一实施例的字节码的优化装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明其中一实施例,提供了一种字节码的优化方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明其中一实施例的字节码的优化方法的流程图,如图1所示,该方法包括如下步骤:
步骤S10,获取待优化函数;
步骤S12,解析待优化函数,得到函数字节码;
步骤S14,分析函数字节码,得到与函数调用关联的第一字节码段;
步骤S16,替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,其中,父函数为调用操作的执行主体,子函数为调用操作的执行对象。
通过上述步骤,可以采用对待优化函数进行解析以得到函数字节码,并对函数字节码进行分析以得到与函数调用关联的第一字节码段的方式,通过替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,该父函数为调用操作的执行主体,子函数为调用操作的执行对象,达到了在现有的代码层优化基础上,通过分析函数调用关系并通过函数内联展开方式对函数调用开销进行优化,以进一步提升Python程序运行性能的目的,从而实现了在字节码级别显著地提升函数执行效率的技术效果,进而解决了相关技术中所提供的Python程序运行性能的优化方案复杂度较高、实用性较差、性能提升有限的技术问题。
Python的函数类型(FunctionType)由以下成员构成:
(1)func_code是指Python的代码类型(CodeType)对象;
(2)func_globals包括全局环境的字典;
(3)func_closure包括胞体元组;
(4)func_defaults包括默认参数;
(5)func_dict表示任意函数属性的命名空间;
(6)func_name表示函数名称。
Python的代码类型由以下成员构成:
(1)co_code表示字节码;
(2)co_cellvars表示嵌套函数调用的变量名元组;
(3)co_consts表示常量元组;
(4)co_filename表示文件名;
(5)co_argcount表示参数的个数,不包括*和**参数;
(6)co_firstlineno表示被编译源代码的第一行行号;
(7)co_flags表示标志位;
(8)co_freevars表示自由变量;
(9)co_lnotab表示源代码行号对应的字节码偏移量;
(10)co_names表示代码内所有变量名元组;
(11)co_nlocals表示局部变量个数;
(12)co_stacksize表示虚拟机堆栈大小;
(13)co_varnames表示全部的局部变量名及参数名元组。
通过分析可知,Python的函数主要由func_code等成员组成,而字节码则存在于func_code的co_code中。为此,本发明实施例所提供的优化方案主要是通过修改func_code、co_code、func_globals等对象来实现。
当函数之间存在调用关系时,通常将调用者称为父函数,被调用者称为子函数。由于函数调用(CALL_FUNCTION)指令开销较大,函数内联优化便是将子函数的字节码复制到父函数中,以使父函数不再使用CALL_FUNCTION指令来调用子函数,从而优化函数的执行速度。
可选地,在步骤S14中,分析函数字节码,得到第一字节码段可以包括以下执行步骤:
步骤S141,在函数字节码中查找函数调用指令字节码;
步骤S142,按照调用指令字节码确定第一字节码段。
具体地,分析函数内CALL_FUNCTION、POP_TOP等字节码,CALL_FUNCTION表示一次函数调用,其会读取当前栈顶的函数对象,并执行调用逻辑。该步骤会根据CALL_FUNCTION指令查找到可被内联的字节码片段。
可选地,在步骤S16中,替换第一字节码段中的第二字节码段可以包括以下执行步骤:
步骤S160,确定子函数的第三字节码段中存在第一类指令,其中,第一类指令中未携带参数;
步骤S161,依据第一类指令所占用的字节,采用第三字节码段替换第二字节码段。
Python的虚拟机指令可以分为:含参指令与无参指令。每个指令各自对应一个编号,编号范围在0到255之间,编号小于90的为无参指令,长度为1个字节,其中,指令占用1个字节。编号大于或等于90的字节码为有参指令,长度为3个字节,其中,指令占用1个字节,参数占用2个字节。依照指令的功能差异,不同的指令具有不同的内联方式。
当指令不含参数时,例如:BINARY_ADD加法指令,在这种情况下直接内联字节码即可。
例如:def f2(i):
i+i
def f1(i):
f2(i)
f2(i)
其中,f2为子函数,其功能为传入参数i,然后将参数i相加。f1为父函数,父函数f1调用子函数f2两次。
通过对子函数f2进行反编译,得到如下虚拟机汇编指令:
由此可见,LOAD_FAST总共需要执行两次,表示读取参数i两次,BINARY_ADD表示将前两次读取的参数相加。
通过对父函数f1进行反编译,得到如下虚拟机汇编指令:
由此可见,父函数在执行CALL_FUNCTION之后,会调用函数f2。CALL_FUNCTION指令在虚拟机内部实现上开销较大,若能够对其进行优化,则这段代码可获得运行性能提升。
为此,使用函数内联的方式可以节省CALL_FUNCTION等指令的开销。在底层实现上,函数调用过程中会存在参数压栈、帧创建、递归保护、异常机制等过程,这些过程都会存在较大开销。
具体地,可以将父函数f1中的字节码LOAD_GLOBAL、LOAD_FAST、CALL_FUNCTION替换为子函数f2中的字节码LOAD_FAST、LOAD_FAST、BINARY_ADD。最终,优化后的字节码如下所示:
可选地,在步骤S16中,替换第一字节码段中的第二字节码段可以包括以下执行步骤:
步骤S162,确定子函数的第三字节码段中存在第二类指令,其中,第二类指令中携带有预先定义的参数;
步骤S163,依据第二类指令所占用的字节,采用第三字节码段替换第二字节码段。
当指令包含参数,但是参数表示固定含义时,例如:COMPARE_OP比较操作符,其参数表示选择哪个运算符,这类指令在内联过程中保留原字节码即可。
例如:def f1():
1==1
def f2():
2>1
其中,子函数f1执行1==1的比较运算,子函数f2执行2>1的比较运算。
对子函数f1进行反编译,得到如下虚拟机汇编指令:
其中,COMPARE_OP的参数为2,表示相等符号(==)的比较运算。
对子函数f2进行反编译,得到如下虚拟机汇编指令:
其中,COMPARE_OP的参数为4,表示大于符号(>)的比较运算。
若父函数与子函数内联,则只需保留COMPARE_OP的参数值即可,并不需要修改COMPARE_OP的参数值。
可选地,在步骤S16中,替换第一字节码段中的第二字节码段可以包括以下执行步骤:
步骤S164,确定子函数的第三字节码段中存在第三类指令,其中,第三类指令中携带有指向预设元组的参数;
步骤S165,依据第三类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整预设元组内对象的索引位置。
当指令包含参数,但是参数指向co_names、co_varnames等元组内的对象时,内联字节码需要同时合并相关元组,由于内联后的元组内对象的索引位置发生变更,因此,需要修改参数,使其指向新的索引位置。
例如,def f2(i):
i
def f1(a,i):
f2(i)
其中,父函数f1调用子函数f2,并且父函数传入两个参数a和i,子函数传入一个参数i。
对子函数f2进行反编译,得到如下虚拟机汇编指令:
其中,LOAD_FAST指令表示从co_varnames元组取值,读取局部变量。在该示例中,LOAD_FAST指令从索引位置0读取局部变量i的值,其参数为0。
对父函数f1进行反编译,得到如下虚拟机汇编指令:
其中,LOAD_FAST指令从索引位置1取值,读取局部变量i,其参数为1,并使用CALL_FUNCTION指令调用子函数f2。
由于在父函数与子函数内联之后,子函数f2的i在co_varnames中的索引位置从0变为1,因此,需要将内联后的LOAD_FAST指令的参数改为1,从而确保读取到的仍为参数i。
内联后父函数的字节码如下所示:
由此可见,由于指令数量明显减少,函数运行性能得到极大地提升。
可选地,在步骤S16中,替换第一字节码段中的第二字节码段可以包括以下执行步骤:
步骤S166,确定子函数的第三字节码段中存在第四类指令,其中,第四类指令中携带有指示待跳转字节位置的参数;
步骤S167,依据第四类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整待跳转字节位置。
对于指令包含参数,但是指令涉及到JUMP操作,例如:POP_JUMP_IF_FALSE指令表示当函数栈顶元素为假时,弹出栈顶并跳转到指令参数指向的字节位置。但是在字节码内联之后,由于内联后原先指向的字节位置发生偏移,因此,需将POP_JUMP_IF_FALSE指令指向新的字节位置。
例如,父函数字节码如下所示:
由此可见,POP_JUMP_IF_FALSE指向字节地址16。
内联后字节码如下所示:
由此可见,POP_JUMP_IF_FALSE指向字节地址10。
可选地,在步骤S16中,替换第一字节码段中的第二字节码段可以包括以下执行步骤:
步骤S168,确定子函数的第三字节码段中存在第五类指令,其中,第五类指令用于返回执行结果;
步骤S169,当第五类指令的接续指令为父函数中待执行的指令时,采用第三字节码段替换第二字节码段,并删除第五类指令;或者,当第五类指令的接续指令为其他子函数中待执行的指令时,采用第三字节码段替换第二字节码段,并继续执行父函数中待执行的指令。
对于需要单独处理子函数的RETURN_VALUE指令,由于RETURN_VALUE会导致内联后父函数执行子函数的RETURN_VALUE而提前返回。因此,内联后如果后续执行指令为父函数中待执行的指令,则可以删除RETURN_VALUE相关指令,如果后续执行指令为其余子函数中待执行的指令,则可以跳过其余子函数直接执行父函数中待执行的指令,从而确保父函数正常运行。
例如,父函数需要调用子函数,父函数字节码如下所示:
子函数字节码如下所示:
0LOAD_CONST 0(None)
3RETURN_VALUE
由于子函数以RETURN_VALUE指令结束,因此,子函数的RETURN_VALUE指令不应该内联到父函数中,否则父函数执行了子函数的RETURN_VALUE会导致父函数提前返回。最终父函数与子函数的内联结果如下所示:
由此可见,子函数中的RETURN_VALUE指令未在父函数中出现。
图2是根据本发明其中一优选实施例的字节码函数内联优化过程的流程图,如图2所示,函数内联优化过程可以包括以下处理步骤:
步骤S201、输入待优化函数,其中,待优化函数包括:函数字节码及上下文空间。
步骤S202、使用Python标准库dis、opcode库从待优化函数中解析出函数字节码。
步骤S203、根据函数字节码分析与函数调用关联的字节码段(相当于上述第一字节码段)。
步骤S204、读取内联的子函数字节码,并根据上文提到的多种内联方式,对父函数中调用子函数的字节码段(相当于上述第二字节码段)进行替换,并将子函数的上下文空间合并到父函数中。
步骤S205、最后将修改过的函数输出。
具体的,可使用Python的热更新机制,在程序执行期间将待优化函数的全部字节码替换为修改后的字节码及上下文空间,从而显著地提升程序执行性能。
经测试发现,优化后的字节码极大地节省了python虚拟机的不必要指令。将内联的子函数调整为10个,测试环境为个人计算机(PC),解释器版本为Python 2.7,使用timeit计算开销,默认循环一百万次的函数调用测试。优化前的函数调用开销为1.352秒,优化后的函数调用开销为0.167秒,即开销下降约87%。在实际项目开发过程中,通过上述优化方式,代码整体开销下降4.2%。
根据本发明其中一实施例,提供了一种字节码的优化装置的实施例,图3是根据本发明其中一实施例的字节码的优化装置的结构框图,如图3所示,该装置包括:获取模块10,用于获取待优化函数;解析模块20,用于解析待优化函数,得到函数字节码;分析模块30,用于分析函数字节码,得到与函数调用关联的第一字节码段;优化模块40,用于替换第一字节码段中父函数调用子函数的第二字节码段,并将子函数的上下文空间合并至父函数,其中,父函数为调用操作的执行主体,子函数为调用操作的执行对象。
可选地,分析模块30包括:查找单元(图中未示出),用于在函数字节码中查找函数调用指令字节码;确定单元(图中未示出),用于按照调用指令字节码确定第一字节码段。
可选地,优化模块40包括:第一确定单元(图中未示出),用于确定子函数的第三字节码段中存在第一类指令,其中,第一类指令中未携带参数;第一优化单元(图中未示出),用于依据第一类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,优化模块40包括:第二确定单元(图中未示出),用于确定子函数的第三字节码段中存在第二类指令,其中,第二类指令中携带有预先定义的参数;第二优化单元(图中未示出),用于依据第二类指令所占用的字节,采用第三字节码段替换第二字节码段。
可选地,优化模块40包括:第三确定单元(图中未示出),用于确定子函数的第三字节码段中存在第三类指令,其中,第三类指令中携带有指向预设元组的参数;第三优化单元(图中未示出),用于依据第三类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整预设元组内对象的索引位置。
可选地,优化模块40包括:第四确定单元(图中未示出),用于确定子函数的第三字节码段中存在第四类指令,其中,第四类指令中携带有指示待跳转字节位置的参数;第四优化单元(图中未示出),用于依据第四类指令所占用的字节,采用第三字节码段替换第二字节码段,并调整待跳转字节位置。
可选地,优化模块40包括:第五确定单元(图中未示出),用于确定子函数的第三字节码段中存在第五类指令,其中,第五类指令用于返回执行结果;第五优化单元(图中未示出),用于当第五类指令的接续指令为父函数中待执行的指令时,采用第三字节码段替换第二字节码段,并删除第五类指令;或者,当第五类指令的接续指令为其他子函数中待执行的指令时,采用第三字节码段替换第二字节码段,并继续执行父函数中待执行的指令。
根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述字节码的优化方法。上述存储介质可以包括但不限于:U盘、只读存储器(ROM)、随机存取存储器(RAM)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
根据本发明其中一实施例,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述字节码的优化方法。上述处理器可以包括但不限于:微处理器(MCU)或可编程逻辑器件(FPGA)等的处理装置。
根据本发明其中一实施例,还提供了一种终端,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序用于执行上述字节码的优化方法。在一些实施例中,上述终端可以是智能手机(例如:Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,简称为MID)、PAD等终端设备。上述显示装置可以是触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与终端的用户界面进行交互。此外,上述终端还可以包括:输入/输出接口(I/O接口)、通用串行总线(USB)端口、网络接口、电源和/或相机。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (17)
1.一种字节码的优化方法,其特征在于,包括:
获取待优化函数;
解析所述待优化函数,得到函数字节码;
分析所述函数字节码,得到与函数调用关联的第一字节码段;
替换所述第一字节码段中父函数调用子函数的第二字节码段,并将所述子函数的上下文空间合并至所述父函数,其中,所述父函数为调用操作的执行主体,所述子函数为所述调用操作的执行对象。
2.根据权利要求1所述的方法,其特征在于,分析所述函数字节码,得到所述第一字节码段包括:
在所述函数字节码中查找函数调用指令字节码;
按照所述调用指令字节码确定所述第一字节码段。
3.根据权利要求1所述的方法,其特征在于,替换所述第一字节码段中的所述第二字节码段包括:
确定所述子函数的第三字节码段中存在第一类指令,其中,所述第一类指令中未携带参数;
依据所述第一类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段。
4.根据权利要求1所述的方法,其特征在于,替换所述第一字节码段中的所述第二字节码段包括:
确定所述子函数的第三字节码段中存在第二类指令,其中,所述第二类指令中携带有预先定义的参数;
依据所述第二类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段。
5.根据权利要求1所述的方法,其特征在于,替换所述第一字节码段中的所述第二字节码段包括:
确定所述子函数的第三字节码段中存在第三类指令,其中,所述第三类指令中携带有指向预设元组的参数;
依据所述第三类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段,并调整所述预设元组内对象的索引位置。
6.根据权利要求1所述的方法,其特征在于,替换所述第一字节码段中的所述第二字节码段包括:
确定所述子函数的第三字节码段中存在第四类指令,其中,所述第四类指令中携带有指示待跳转字节位置的参数;
依据所述第四类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段,并调整所述待跳转字节位置。
7.根据权利要求1所述的方法,其特征在于,替换所述第一字节码段中的所述第二字节码段包括:
确定所述子函数的第三字节码段中存在第五类指令,其中,所述第五类指令用于返回执行结果;
当所述第五类指令的接续指令为所述父函数中待执行的指令时,采用所述第三字节码段替换所述第二字节码段,并删除所述第五类指令;或者,当所述第五类指令的接续指令为其他子函数中待执行的指令时,采用所述第三字节码段替换所述第二字节码段,并继续执行所述父函数中待执行的指令。
8.一种字节码的优化装置,其特征在于,包括:
获取模块,用于获取待优化函数;
解析模块,用于解析所述待优化函数,得到函数字节码;
分析模块,用于分析所述函数字节码,得到与函数调用关联的第一字节码段;
优化模块,用于替换所述第一字节码段中父函数调用子函数的第二字节码段,并将所述子函数的上下文空间合并至所述父函数,其中,所述父函数为调用操作的执行主体,所述子函数为所述调用操作的执行对象。
9.根据权利要求8所述的装置,其特征在于,所述分析模块包括:
查找单元,用于在所述函数字节码中查找函数调用指令字节码;
确定单元,用于按照所述调用指令字节码确定所述第一字节码段。
10.根据权利要求8所述的装置,其特征在于,所述优化模块包括:
第一确定单元,用于确定所述子函数的第三字节码段中存在第一类指令,其中,所述第一类指令中未携带参数;
第一优化单元,用于依据所述第一类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段。
11.根据权利要求8所述的装置,其特征在于,所述优化模块包括:
第二确定单元,用于确定所述子函数的第三字节码段中存在第二类指令,其中,所述第二类指令中携带有预先定义的参数;
第二优化单元,用于依据所述第二类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段。
12.根据权利要求8所述的装置,其特征在于,所述优化模块包括:
第三确定单元,用于确定所述子函数的第三字节码段中存在第三类指令,其中,所述第三类指令中携带有指向预设元组的参数;
第三优化单元,用于依据所述第三类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段,并调整所述预设元组内对象的索引位置。
13.根据权利要求8所述的装置,其特征在于,所述优化模块包括:
第四确定单元,用于确定所述子函数的第三字节码段中存在第四类指令,其中,所述第四类指令中携带有指示待跳转字节位置的参数;
第四优化单元,用于依据所述第四类指令所占用的字节,采用所述第三字节码段替换所述第二字节码段,并调整所述待跳转字节位置。
14.根据权利要求8所述的装置,其特征在于,所述优化模块包括:
第五确定单元,用于确定所述子函数的第三字节码段中存在第五类指令,其中,所述第五类指令用于返回执行结果;
第五优化单元,用于当所述第五类指令的接续指令为所述父函数中待执行的指令时,采用所述第三字节码段替换所述第二字节码段,并删除所述第五类指令;或者,当所述第五类指令的接续指令为其他子函数中待执行的指令时,采用所述第三字节码段替换所述第二字节码段,并继续执行所述父函数中待执行的指令。
15.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行权利要求1至7中任意一项所述的字节码的优化方法。
16.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至7中任意一项所述的字节码的优化方法。
17.一种终端,其特征在于,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序用于执行权利要求1至7中任意一项所述的字节码的优化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711431847.5A CN108021370B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711431847.5A CN108021370B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108021370A true CN108021370A (zh) | 2018-05-11 |
CN108021370B CN108021370B (zh) | 2020-05-12 |
Family
ID=62071796
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711431847.5A Active CN108021370B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108021370B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
CN111078279A (zh) * | 2019-12-20 | 2020-04-28 | 北京字节跳动网络技术有限公司 | 字节码文件的处理方法、装置、设备及存储介质 |
CN111124424A (zh) * | 2019-12-27 | 2020-05-08 | 珠海金山网络游戏科技有限公司 | 一种算法复杂度分析的方法和装置 |
US10783082B2 (en) | 2019-08-30 | 2020-09-22 | Alibaba Group Holding Limited | Deploying a smart contract |
CN114003317A (zh) * | 2021-10-29 | 2022-02-01 | 北京达佳互联信息技术有限公司 | 内联实现方法及装置、电子设备、存储介质及程序产品 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1609805A (zh) * | 2003-10-17 | 2005-04-27 | 松下电器产业株式会社 | 编译装置 |
US20050198624A1 (en) * | 2004-03-02 | 2005-09-08 | Chipman Timothy W. | Method and system for program transformation |
US20120047486A1 (en) * | 2010-08-17 | 2012-02-23 | Oracle International Corporation | Optimized implementation of breakpoint in java debugger agent |
CN103593291A (zh) * | 2013-11-18 | 2014-02-19 | 北京邮电大学 | 用于包括多个函数测试模块的单元测试方法及装置 |
CN105653351A (zh) * | 2015-12-30 | 2016-06-08 | 北京博思汇众科技股份有限公司 | java卡虚拟机的优化方法及系统 |
CN106557350A (zh) * | 2015-09-30 | 2017-04-05 | 北京金山安全软件有限公司 | 应用程序安装包中java字节码转换方法、装置及设备 |
-
2017
- 2017-12-26 CN CN201711431847.5A patent/CN108021370B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1609805A (zh) * | 2003-10-17 | 2005-04-27 | 松下电器产业株式会社 | 编译装置 |
US20050198624A1 (en) * | 2004-03-02 | 2005-09-08 | Chipman Timothy W. | Method and system for program transformation |
US20120047486A1 (en) * | 2010-08-17 | 2012-02-23 | Oracle International Corporation | Optimized implementation of breakpoint in java debugger agent |
CN103593291A (zh) * | 2013-11-18 | 2014-02-19 | 北京邮电大学 | 用于包括多个函数测试模块的单元测试方法及装置 |
CN106557350A (zh) * | 2015-09-30 | 2017-04-05 | 北京金山安全软件有限公司 | 应用程序安装包中java字节码转换方法、装置及设备 |
CN105653351A (zh) * | 2015-12-30 | 2016-06-08 | 北京博思汇众科技股份有限公司 | java卡虚拟机的优化方法及系统 |
Non-Patent Citations (2)
Title |
---|
ROMAIN GAUCHER: "Understanding Python bytecode", 《HTTPS://WWW.SYNOPSYS.COM/BLOGS/SOFTWARE-SECURITY/UNDERSTANDING-PYTHON-BYTECODE》 * |
VEDA原型: "PHP内核探索:中间代码opcode的执行", 《HTTP://WWW.NOWAMAGIC.NET/LIBRARYS/VEDA/DETAIL/1543》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
US10783082B2 (en) | 2019-08-30 | 2020-09-22 | Alibaba Group Holding Limited | Deploying a smart contract |
US11010303B2 (en) | 2019-08-30 | 2021-05-18 | Advanced New Technologies Co., Ltd. | Deploying a smart contract |
US11307990B2 (en) | 2019-08-30 | 2022-04-19 | Advanced New Technologies Co., Ltd. | Deploying a smart contract |
CN111078279A (zh) * | 2019-12-20 | 2020-04-28 | 北京字节跳动网络技术有限公司 | 字节码文件的处理方法、装置、设备及存储介质 |
CN111124424A (zh) * | 2019-12-27 | 2020-05-08 | 珠海金山网络游戏科技有限公司 | 一种算法复杂度分析的方法和装置 |
CN111124424B (zh) * | 2019-12-27 | 2023-09-19 | 珠海金山数字网络科技有限公司 | 一种算法复杂度分析的方法和装置 |
CN114003317A (zh) * | 2021-10-29 | 2022-02-01 | 北京达佳互联信息技术有限公司 | 内联实现方法及装置、电子设备、存储介质及程序产品 |
Also Published As
Publication number | Publication date |
---|---|
CN108021370B (zh) | 2020-05-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108021370A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
CN108037926A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
KR101699981B1 (ko) | 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화 | |
US6002874A (en) | Method and system for translating goto-oriented procedural languages into goto-free object oriented languages | |
CN106168965B (zh) | 知识图谱构建系统 | |
US7661096B2 (en) | Interaction with nested and non-nested streams | |
US11531529B2 (en) | Method and electronic device for deploying operator in deep learning framework | |
KR100421234B1 (ko) | 플랫폼-독립형 가상기계의 기호표 탐색 최적화 | |
US8244780B1 (en) | Parameter oriented automated database command | |
CN101763261A (zh) | 数据抽取、转换和加载方法、系统及装置 | |
CN112052006B (zh) | 一种软件代码编译方法及系统 | |
CN109947770A (zh) | 一种数据库查询方法、终端设备及存储介质 | |
CN115809063B (zh) | 一种存储过程编译方法、系统、电子设备和存储介质 | |
CN106020920A (zh) | 一种jcvm解释器的预处理方法及系统 | |
CN109445773A (zh) | 一种基于编程语言提升浏览器性能的方法以及电子设备 | |
CN103455476B (zh) | 网络信息的处理方法和抽象语法树的建立方法及其装置 | |
CN106598828A (zh) | 一种源代码中的无效类确定方法及装置 | |
CN101520733B (zh) | 装载类的方法和装置及重组类存档文件方法 | |
US5715458A (en) | Incorporation of services written in one operating system environment into another operating system environment | |
CN107479866A (zh) | 基于重构技术实现开放终端应用数据与功能的方法 | |
CN108153530A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
US20040154004A1 (en) | Web application code conversion system | |
Dong et al. | An optimizing compiler for efficient model checking | |
KR20170080789A (ko) | 상용 인터프리터를 이용한 스크립트 기반 데이터 처리 시스템 | |
Meier et al. | An architecture for prolog extensions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |