CN108037926A - 字节码的优化方法、装置、存储介质、处理器及终端 - Google Patents
字节码的优化方法、装置、存储介质、处理器及终端 Download PDFInfo
- Publication number
- CN108037926A CN108037926A CN201711433389.9A CN201711433389A CN108037926A CN 108037926 A CN108037926 A CN 108037926A CN 201711433389 A CN201711433389 A CN 201711433389A CN 108037926 A CN108037926 A CN 108037926A
- Authority
- CN
- China
- Prior art keywords
- bytecode
- section
- function
- global variable
- variable
- 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
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程序运行性能的目的,从而实现了在字节码级别显著地提升函数执行效率的技术效果,进而解决了相关技术中所提供的Python程序运行性能的优化方案复杂度较高、实用性较差、性能提升有限的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明其中一实施例的字节码的优化方法的流程图;
图2是根据本发明其中一优选实施例的字节码全局变量调用优化过程的流程图;
图3是根据本发明其中一实施例的字节码的优化装置的结构框图;
图4是根据本发明其中一优选实施例的字节码的优化装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明其中一实施例,提供了一种字节码的优化方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明其中一实施例的字节码的优化方法的流程图,如图1所示,该方法包括如下步骤:
步骤S10,获取待优化函数;
步骤S12,解析待优化函数,得到函数字节码;
步骤S14,分析函数字节码,得到首次访问全局变量的第一字节码段,其中,全局变量在待优化函数执行过程中被多次访问;
步骤S16,采用访问局部变量的第二字节码段替换重复出现的第一字节码段。
通过上述步骤,可以采用从待优化函数中解析得到函数字节码,并分析函数字节码以得到首次访问全局变量的第一字节码段,该全局变量在待优化函数执行过程中被多次访问的方式,通过将重复出现的第一字节码段替换为访问局部变量的第二字节码段,达到了在现有的代码层优化基础上,由于Python访问局部变量的速度快于访问全局变量的速度,因此可以将原先访问全局变量的字节码修改为访问局部变量的字节码,以进一步提升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等对象来实现。
可选地,在步骤S14中,分析函数字节码,得到第一字节码段可以包括以下执行步骤:
步骤S141,从函数字节码中查找首次出现的全局变量访问指令;
步骤S142,根据全局变量访问指令确定第一字节码段。
通过访问全局空间读取的变量被称为全局变量。全局变量通过LOAD_GLOBAL访问,其后可以跟随LOAD_ATTR指令。
例如:
def f():
a.b.c
函数f的功能为访问全局变量a的成员b的成员c。
反编译其字节码如下所示:
Python的全局变量优化方式能够显著提高程序运行性能。LOAD_GLOBAL指令是Python访问全局变量的指令,其在虚拟机底层的是通过访问哈希表来实现的。LOAD_ATTR指令是一次取属性的操作,也是通过访问哈希表来实现的。这两条指令需要先通过哈希函数计算出目标内存地址才能够访问。LOAD_FAST指令是Python访问局部变量的指令,其在底层是通过访问数组的下标来实现的,而数组下标可以直接访问目标内存地址,因此,LOAD_FAST的访问速度要快于LOAD_GLOBAL的访问速度。STORE_FAST指令表示将虚拟机栈顶元素缓存到局部变量中。因此,访问全局变量的指令可以在第一次调用时先采用STORE_FAST指令缓存在局部变量中,在函数内第二次使用时直接使用LOAD_FAST指令从缓存中读取。
为此,分析函数内多次调用同一个全局变量的LOAD_GLOBAL指令,即当一个全局变量在一个函数内可能会被调用多次时,则认为其可以被优化。
如下所示,函数f1两次访问全局变量a的b属性:
def f1():
a.b
a.b
其字节码表示为:
字节位置0~字节位置3表示第一次读取全局变量,字节位置7~字节位置10表示第二次读取全局变量。如果LOAD_GLOBAL出现在循环逻辑中,则认为其可能会被调用多次,同样认为其可被优化。
如下所示,函数f2两次访问全局变量a的b属性:
def f2():
for i in xrange(2):
a.b
反编译其字节码表示为:
由此可知,LOAD_GLOBAL,LOAD_ATTR等指令出现在循环语句中,因此将其视为可优化部分。
可选地,在步骤S16中,采用访问局部变量的第二字节码段替换重复出现的第一字节码段可以包括以下执行步骤:
步骤S161,确定全局变量访问指令未出现在待优化函数的循环逻辑中;
步骤S162,将按照全局变量访问指令读取到的全局变量缓存为局部变量以及通过局部变量访问指令访问局部变量,生成第二字节码段;
步骤S163,采用第二字节码段替换重复出现的第一字节码段。
针对非循环情况下的优化,如上述函数f1所示,第一次读取全局变量之后缓存到局部变量_cache_a_b中,第二次读取时直接使用LOAD_FAST指令从局部变量_cache_a_b中读取,f1优化后字节码如下:
需要说明的是,上述重复出现的LOAD_GLOBAL和LOAD_ATTR即为上述第一字节码段。上述由STORE_FAST和LOAD_FAST构成的字节码段即为上述第二字节码段。
可选地,在步骤S16中,采用访问局部变量的第二字节码段替换重复出现的第一字节码段可以包括以下执行步骤:
步骤S164,确定全局变量访问指令出现在待优化函数的循环逻辑中;
步骤S165,在循环逻辑之外将按照全局变量访问指令读取到的全局变量缓存为局部变量以及在循环逻辑内通过局部变量访问指令访问局部变量,生成第二字节码段;
步骤S166,采用第二字节码段替换重复出现的第一字节码段。
针对循环情况下的优化,如上述函数f2所示,先在循环外缓存局部变量_cache_a_b,然后在读取时直接使用LOAD_FAST指令从局部变量_cache_a_b中读取,f2优化后字节码如下:
由此可见,循环内的LOAD_GLOBAL、LOAD_ATTR等指令均已被LOAD_FAST指令替换。
可选地,在步骤S16,采用访问局部变量的第二字节码段替换重复出现的第一字节码段之后,还可以包括以下执行步骤:
步骤S17,确定在函数字节码中存在跳转指令字节码;
步骤S18,根据第二字节码段以及上下文空间所占据的字节位置调整跳转指令字节码重新指向的字节位置。
由于字节码总长度发生变化,原JUMP跳转指令指向的字节地址已发生偏移,此时需要修改相关JUMP指令的参数,使其指向新的位置。例如,在上述函数f2的字节码中,修改前JUMP_ABSOLUTE指向字节地址为13,而修改后的字节地址指向22。
图2是根据本发明其中一优选实施例的字节码全局变量调用优化过程的流程图,如图2所示,字节码全局变量调用优化过程可以包括以下处理步骤:
步骤S201、输入待优化函数。
步骤S202、从待优化函数中解析出函数字节码。
步骤S203、从函数字节码中分析函数内全局变量调用的字节码段。
步骤S204、修改可优化的函数字节码,并修改函数的上下文。
步骤S205、最后将修改过的函数输出。
具体的,可使用Python的热更新机制,在程序执行期间将待优化函数的全部字节码替换为修改后的字节码及上下文空间,从而显著地提升程序执行性能。
经测试发现,优化后的字节码极大地节省了python虚拟机的不必要指令。测试环境为个人计算机(PC),解释器版本为Python 2.7,使用timeit计算开销,默认循环一百万次的函数调用测试。优化前的函数调用开销为0.291秒,优化后的函数调用开销为0.165秒,即开销下降约43%。
根据本发明其中一实施例,提供了一种字节码的优化装置的实施例,图3是根据本发明其中一实施例的字节码的优化装置的结构框图,如图3所示,该装置包括:获取模块10,用于获取待优化函数;解析模块20,用于解析待优化函数,得到函数字节码;分析模块30,用于分析函数字节码,得到首次访问全局变量的第一字节码段,其中,全局变量在待优化函数执行过程中被多次访问;优化模块40,用于采用访问局部变量的第二字节码段替换重复出现的第一字节码段。
可选地,分析模块30包括:查找单元(图中未示出),用于从函数字节码中查找首次出现的全局变量访问指令;第一确定单元(图中未示出),用于根据全局变量访问指令确定第一字节码段。
可选地,优化模块40包括:第二确定单元(图中未示出),用于确定全局变量访问指令未出现在待优化函数的循环逻辑中;第一处理单元(图中未示出),用于将按照全局变量访问指令读取到的全局变量缓存为局部变量以及通过局部变量访问指令访问局部变量,生成第二字节码段;第一替换单元(图中未示出),用于采用第二字节码段替换重复出现的第一字节码段。
可选地,优化模块40包括:第三确定单元(图中未示出),用于确定全局变量访问指令出现在待优化函数的循环逻辑中;第二处理单元(图中未示出),用于在循环逻辑之外将按照全局变量访问指令读取到的全局变量缓存为局部变量以及在循环逻辑内通过局部变量访问指令访问局部变量,生成第二字节码段;第二替换单元(图中未示出),用于采用第二字节码段替换重复出现的第一字节码段。
可选地,图4是根据本发明其中一优选实施例的字节码的优化装置的结构框图,如图4所示,上述装置还包括:确定模块50,用于确定在函数字节码中存在跳转指令字节码;调整模块60,用于根据第二字节码段以及上下文空间所占据的字节位置调整跳转指令字节码重新指向的字节位置。
根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述字节码的优化方法。上述存储介质可以包括但不限于: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 (13)
1.一种字节码的优化方法,其特征在于,包括:
获取待优化函数;
解析所述待优化函数,得到函数字节码;
分析所述函数字节码,得到首次访问全局变量的第一字节码段,其中,所述全局变量在所述待优化函数执行过程中被多次访问;
采用访问局部变量的第二字节码段替换重复出现的所述第一字节码段。
2.根据权利要求1所述的方法,其特征在于,分析所述函数字节码,得到所述第一字节码段包括:
从所述函数字节码中查找首次出现的全局变量访问指令;
根据所述全局变量访问指令确定所述第一字节码段。
3.根据权利要求2所述的方法,其特征在于,采用访问所述局部变量的所述第二字节码段替换重复出现的所述第一字节码段包括:
确定所述全局变量访问指令未出现在所述待优化函数的循环逻辑中;
将按照所述全局变量访问指令读取到的所述全局变量缓存为局部变量以及通过局部变量访问指令访问所述局部变量,生成所述第二字节码段;
采用所述第二字节码段替换重复出现的所述第一字节码段。
4.根据权利要求2所述的方法,其特征在于,采用访问所述局部变量的所述第二字节码段替换重复出现的所述第一字节码段包括:
确定所述全局变量访问指令出现在所述待优化函数的循环逻辑中;
在所述循环逻辑之外将按照所述全局变量访问指令读取到的所述全局变量缓存为局部变量以及在所述循环逻辑内通过局部变量访问指令访问所述局部变量,生成所述第二字节码段;
采用所述第二字节码段替换重复出现的所述第一字节码段。
5.根据权利要求1所述的方法,其特征在于,在采用访问所述局部变量的所述第二字节码段替换重复出现的所述第一字节码段之后,还包括:
确定在所述函数字节码中存在跳转指令字节码;
根据所述第二字节码段以及上下文空间所占据的字节位置调整所述跳转指令字节码重新指向的字节位置。
6.一种字节码的优化装置,其特征在于,包括:
获取模块,用于获取待优化函数;
解析模块,用于解析所述待优化函数,得到函数字节码;
分析模块,用于分析所述函数字节码,得到首次访问全局变量的第一字节码段,其中,所述全局变量在所述待优化函数执行过程中被多次访问;
优化模块,用于采用访问局部变量的第二字节码段替换重复出现的所述第一字节码段。
7.根据权利要求6所述的装置,其特征在于,所述分析模块包括:
查找单元,用于从所述函数字节码中查找首次出现的全局变量访问指令;
第一确定单元,用于根据所述全局变量访问指令确定所述第一字节码段。
8.根据权利要求7所述的装置,其特征在于,所述优化模块包括:
第二确定单元,用于确定所述全局变量访问指令未出现在所述待优化函数的循环逻辑中;
第一处理单元,用于将按照所述全局变量访问指令读取到的所述全局变量缓存为局部变量以及通过局部变量访问指令访问所述局部变量,生成所述第二字节码段;
第一替换单元,用于采用所述第二字节码段替换重复出现的所述第一字节码段。
9.根据权利要求7所述的装置,其特征在于,所述优化模块包括:
第三确定单元,用于确定所述全局变量访问指令出现在所述待优化函数的循环逻辑中;
第二处理单元,用于在所述循环逻辑之外将按照所述全局变量访问指令读取到的所述全局变量缓存为局部变量以及在所述循环逻辑内通过局部变量访问指令访问所述局部变量,生成所述第二字节码段;
第二替换单元,用于采用所述第二字节码段替换重复出现的所述第一字节码段。
10.根据权利要求6所述的装置,其特征在于,所述装置还包括:
确定模块,用于确定在所述函数字节码中存在跳转指令字节码;
调整模块,用于根据所述第二字节码段以及上下文空间所占据的字节位置调整所述跳转指令字节码重新指向的字节位置。
11.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行权利要求1至5中任意一项所述的字节码的优化方法。
12.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至5中任意一项所述的字节码的优化方法。
13.一种终端,其特征在于,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序用于执行权利要求1至5中任意一项所述的字节码的优化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711433389.9A CN108037926B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711433389.9A CN108037926B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108037926A true CN108037926A (zh) | 2018-05-15 |
CN108037926B CN108037926B (zh) | 2020-05-05 |
Family
ID=62101192
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711433389.9A Active CN108037926B (zh) | 2017-12-26 | 2017-12-26 | 字节码的优化方法、装置、存储介质、处理器及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108037926B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109992935A (zh) * | 2019-03-15 | 2019-07-09 | 同盾控股有限公司 | 一种源代码保护方法及装置 |
CN110457196A (zh) * | 2019-08-16 | 2019-11-15 | 腾讯科技(深圳)有限公司 | 函数执行时间的获取方法及装置 |
CN110941553A (zh) * | 2019-11-22 | 2020-03-31 | 山东英信计算机技术有限公司 | 一种代码检测方法、装置、设备及可读存储介质 |
CN111737280A (zh) * | 2020-06-22 | 2020-10-02 | 中国银行股份有限公司 | 一种sql存储过程脚本优化的方法及装置 |
CN112988157A (zh) * | 2020-12-21 | 2021-06-18 | 杭州趣链科技有限公司 | 字节码验证方法、装置及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102693150A (zh) * | 2012-05-11 | 2012-09-26 | 深圳市华为技术软件有限公司 | 基于计费专有领域的虚拟机的处理方法及装置 |
US20130290942A1 (en) * | 2012-04-25 | 2013-10-31 | International Business Machines Corporation | Method, computer, and computer program for speculatively optimizing code |
-
2017
- 2017-12-26 CN CN201711433389.9A patent/CN108037926B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130290942A1 (en) * | 2012-04-25 | 2013-10-31 | International Business Machines Corporation | Method, computer, and computer program for speculatively optimizing code |
CN102693150A (zh) * | 2012-05-11 | 2012-09-26 | 深圳市华为技术软件有限公司 | 基于计费专有领域的虚拟机的处理方法及装置 |
Non-Patent Citations (1)
Title |
---|
-柚子皮-: ""Python性能优化"", 《CSDN:HTTPS://BLOG.CSDN.NET/PIPISORRY/ARTICLE/DETAILS/39234557》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109992935A (zh) * | 2019-03-15 | 2019-07-09 | 同盾控股有限公司 | 一种源代码保护方法及装置 |
CN109992935B (zh) * | 2019-03-15 | 2021-05-25 | 同盾控股有限公司 | 一种源代码保护方法及装置 |
CN110457196A (zh) * | 2019-08-16 | 2019-11-15 | 腾讯科技(深圳)有限公司 | 函数执行时间的获取方法及装置 |
CN110457196B (zh) * | 2019-08-16 | 2023-10-24 | 腾讯科技(深圳)有限公司 | 函数执行时间的获取方法及装置 |
CN110941553A (zh) * | 2019-11-22 | 2020-03-31 | 山东英信计算机技术有限公司 | 一种代码检测方法、装置、设备及可读存储介质 |
CN111737280A (zh) * | 2020-06-22 | 2020-10-02 | 中国银行股份有限公司 | 一种sql存储过程脚本优化的方法及装置 |
CN112988157A (zh) * | 2020-12-21 | 2021-06-18 | 杭州趣链科技有限公司 | 字节码验证方法、装置及存储介质 |
CN112988157B (zh) * | 2020-12-21 | 2024-05-07 | 杭州趣链科技有限公司 | 字节码验证方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108037926B (zh) | 2020-05-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108037926A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
CN108021370A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
CN113872948A (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
US20090328012A1 (en) | Compiler in a managed application context | |
CN103777969B (zh) | 一种无需重启部署服务器参数的方法和装置 | |
US10635666B2 (en) | System, method and device for index compilation to optimize index usage | |
CN1656457A (zh) | 管理本机应用程序数据的系统和方法 | |
CN111815310B (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN112416365B (zh) | 文件转换方法、装置及存储介质 | |
CN109445773A (zh) | 一种基于编程语言提升浏览器性能的方法以及电子设备 | |
CN111770204A (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN111768184A (zh) | 一种执行智能合约的方法及区块链节点 | |
Cartright et al. | Galago: A Modular Distributed Processing and Retrieval System. | |
US8407678B2 (en) | Method of array interception using data-flow analysis | |
CN111768183A (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN113344218B (zh) | 机器学习模型的部署方法、装置、电子设备及存储介质 | |
Su et al. | Changing engines in midstream: A Java stream computational model for big data processing | |
CN108153530A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
CN111770202B (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN105487911B (zh) | 一种基于编译指导的众核数据分片方法 | |
CN110308909A (zh) | 针对神经网络处理器的可执行程序生成装置和方法 | |
Meier et al. | An architecture for prolog extensions | |
WO2011046452A2 (en) | Maintaining data integrity across execution environments | |
CN101126988A (zh) | 一种类文件装载方法和系统 | |
CN109918286A (zh) | 一种静态代码分析的处理方法及装置 |
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 |