字节码的优化方法、装置、存储介质、处理器及终端与流程

文档序号:14418939阅读:208来源:国知局
导航: X技术> 最新专利> 计算;推算;计数设备的制造及其应用技术
字节码的优化方法、装置、存储介质、处理器及终端与流程

本发明涉及计算机领域,具体而言,涉及一种字节码的优化方法、装置、存储介质、处理器及终端。



背景技术:

python是一种面向对象、解释型的常用计算机编程语言,其以语法优雅、开发迅速、支持动态类型、丰富的标准库等优点著称,因此在不同领域均得到广泛应用。在游戏开发过程中,其主要作为业务逻辑层脚本语言加以使用。然而,在实际项目开发中,python语言的缺点也十分显著,其中,最大的问题之一便是运行速度缓慢。许多使用python语言开发的项目在中后期阶段由于业务逻辑日益复杂,计算负荷加重,很容易达到性能瓶颈。经过分析发现,造成这种现象的原因在于:python解释器本身的设计缺陷。python语言诞生于上个世纪,当时采纳的许多设计理念已经不适用于当今的硬件条件。在实际使用python语言的项目研发中,通常需要安排专门的人力去优化程序代码,导致部分生产力浪费在程序优化工作上。

python解释器在执行程序时,首先将源代码编译为字节码,再利用python虚拟机加载编译后的字节码执行。基于虚拟机的技术一方面可以实现语言的跨平台特性,另一方面可以实现动态类型支持。相关技术中所提供的字节码优化方案主要可以包括以下几个步骤:

第一步、通过函数开销统计工具(例如:cprofile)统计一段时间内,执行不同函数所消耗的时间。

第二步、针对执行时间较长的函数,分析该函数的源代码,查找存在性能瓶颈的代码。

第三步、修改存在性能瓶颈的代码,以提升程序性能。

第四步、将修改存在性能瓶颈的代码之前的执行开销与修改存在性能瓶颈的代码之后的执行开销进行对比,验证存在性能瓶颈的代码修改是否生效。如果修改未生效,则重复上述步骤,直到程序性能达到运行要求。

基于前述步骤,当定位到存在性能瓶颈的代码时,相关技术中还提供了如下几种优化方案,但这些优化方案大多是基于语言层做出的改进:

方案一、通过修改python的写法来实现对python语言的优化。此种方案的缺陷在于:需要逐行手动修改源代码,并且提升的性能效果有限。

方案二、python源码的c++化来实现对python语言的优化。该方案虽然可以极大地提升程序运行效率,但是其缺陷在于:开发效率低,难以抽象出适合c++化的代码,且失去了python的动态类型特性,丧失了python的热更新机制。一旦需要修改源代码,便需要重新编译成c++进行发布,成本消耗巨大。因此,这种优化方案只适合业务逻辑已经固定的项目。

方案三、通过即时编译技术(justintime,简称为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加法指令,在这种情况下直接内联字节码即可。

例如:deff2(i):

i+i

deff1(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比较操作符,其参数表示选择哪个运算符,这类指令在内联过程中保留原字节码即可。

例如:deff1():

1==1

deff2():

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等元组内的对象时,内联字节码需要同时合并相关元组,由于内联后的元组内对象的索引位置发生变更,因此,需要修改参数,使其指向新的索引位置。

例如,deff2(i):

i

deff1(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_const0(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),解释器版本为python2.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手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,简称为mid)、pad等终端设备。上述显示装置可以是触摸屏式的液晶显示器(lcd),该液晶显示器可使得用户能够与终端的用户界面进行交互。此外,上述终端还可以包括:输入/输出接口(i/o接口)、通用串行总线(usb)端口、网络接口、电源和/或相机。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

完整全部详细技术资料下载
当前第1页 1  2 
相关技术
  • 一种数据集成处理方法及相关装...
  • 表征操作系统内核的方法、装置...
  • 智能家电控制方法、装置及计算...
  • 一种Android平台的天气...
  • 可视化游戏逻辑编辑方法及系统...
  • 提供应用服务的平台及方法、应...
  • 一种数据处理方法及装置与流程
  • 程序调用的优化方法及装置与流...
  • 一种跨屏跨平台的可量测实景地...
  • 一种IOS平台的汽车企业Ap...
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1
终端处理器相关技术
  • 一种信息处理方法和终端的制作方法
  • 一种氧化锌避雷器在线监测与诊断方法
  • 一种水净化系统的制作方法
  • 一种具有触敏显示器的终端的信息处理方法及终端的制作方法
  • 一种在终端中监测处理器的方法及终端的制作方法
  • 一种信息处理方法及终端的制作方法
  • 一种根据眼部动作对终端进行控制的方法及装置的制造方法
  • 一种基于触摸屏的密码安全输入装置的制造方法
  • 一种家庭智能灯光控制系统的制作方法
  • 一种信息处理方法及终端的制作方法
电力负荷管理终端装置相关技术
  • 基于语音终端的BLEMesh装置的制造方法
  • 电池保护方法及装置、终端与流程
  • 年龄识别方法、装置及终端与流程
  • 一种终端防盗报警方法和装置与流程
  • 订单的生成方法及装置、存储介质、处理器、终端与流程
  • 维修金管理方法、装置、终端及计算机可读存储介质与流程
  • 管理方法、装置及终端与流程
  • 终端的解锁方法和装置、终端和计算机可读存储介质与流程
  • 一种检查方法、装置及终端与流程
  • BIM模型数据交换方法、装置、终端及计算机可读存储介质与流程

深圳SEO优化公司永州网络推广价格长治英文网站建设报价天门seo报价曲靖网站优化按天扣费报价泸州网站优化按天扣费哪家好商洛网站优化推广多少钱海西seo优化多少钱阳江百度竞价包年推广哪家好成都品牌网站设计报价台州SEO按天扣费多少钱赤峰网络广告推广推荐南京优秀网站设计价格运城建设网站多少钱荷坳网页制作价格咸宁企业网站设计公司襄阳seo网站推广推荐东营SEO按效果付费价格宜昌百姓网标王推荐海西seo网站推广报价台州百度爱采购滨州seo网站推广报价临沧网站优化推荐忻州模板制作推荐张北网站优化排名公司景德镇建站公司成都网站设计推荐丹竹头网站建设设计哪家好池州百搜标王推荐爱联网络推广哪家好白银百度网站优化排名价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化