性能测试方法及系统与流程

文档序号:11864588阅读:357来源:国知局
性能测试方法及系统与流程

本申请主要涉及计算机技术领域,更具体地说是涉及性能测试方法及系统。



背景技术:

性能测试在软件的质量保证中起着重要的作用,其包括的测试内容丰富多样,可以分为应用在客户端性能的测试、应用在网络上性能的测试以及应用在服务器性能的测试等三方面。

基于此,实际应用中,在开发新的应用程序或者对已有应用程序进行升级或变更等情况下,通常需要对新得到的应用程序进行性能测试,以明确其对其他应用程序或设备运行情况的影响。

然而,现有的性能测试方法多是利用代码打点技术,Hook技术或Trace技术等实现,在实际测试过程中,代码打点技术和Hook技术需要在每次测试时修改代码源码,非常麻烦;而Trace技术需要依赖客户端的操作系统或相应的测试工具,使其应用具有很大的局限性。



技术实现要素:

有鉴于此,本发明提供了一种性能测试方法及系统,通过插入断点的方式,实现了对任意被测试对象性能的测试,无需修改源码,也不依赖客户端的操作系统或相应的测试工作,非常灵活且方便。

为了实现上述目的,本申请提供了以下技术方案:

一种性能测试方法,所述方法包括:

记录在被测试对象的开始位置插入的入口断点的位置,以及在所述被测试对象的结束位置插入的出口断点的位置;

捕获所述被测试对象运行过程中触发的断点异常;

基于获得的与所述入口断点的位置匹配的断点异常的属性信息,以及与所述出口断点的位置匹配的断点异常的属性信息,获得所述被测试对象的性能测试结果。

本申请实施例还提供了一种性能测试系统,所述系统包括:

存储模块,用于记录在被测试对象的开始位置插入的入口断点的位置,以及在所述被测试对象的结束位置插入的出口断点的位置;

异常捕获模块,用于捕获所述被测试对象运行过程中触发的断点异常;

处理模块,用于基于获得的与所述入口断点的位置匹配的断点异常的属性信息,以及与所述出口断点的位置匹配的断点异常的属性信息,获得所述被测试对象的性能测试结果。

由此可见,与现有技术相比,本申请提供了一种性能测试方法及系统,对于任何需要进行性能测试的被测试对象,通过在其开始位置和结束位置都插入断点,并记录在被测试对象的开始位置插入的入口断点的位置以及在结束位置插入的出口断点的位置,这样,在被测试对象的运行过程中,系统会自动捕获到断点异常,之后,就能够基于与该入口断点的位置匹配的断点异常的属性信息,以及与出口断点的位置匹配的断点异常的属性信息,获得被测试对象的性能测试结果。可见,本申请提供的性能测试方法适用于任何测试对象;而且,该测试过程中并未对被测试对象的代码源码进行修改,操作简便,提高了测试效率;并且,该测试过程的实现并不依赖客户端的操作系统或专门的测试工具,易于实现,进一步扩大了适用范围。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请实施例提供的一种性能测试方法的流程图;

图2为本申请实施例提供的另一种性能测试方法的部分流程图;

图3为本申请实施例提供的又一种性能测试方法的流程图;

图4为本申请实施例提供的一种性能测试系统的结构框图;

图5为本申请实施例提供的另一种性能测试系统的部分结构框图;

图6为本申请实施例提供的又一种性能测试系统的结构框图;

图7为本申请实施例提供的一种性能测试系统的硬件结构图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。

参照图1,为本申请实施例提供的一种性能测试方法的流程图,该方法可以包括以下步骤:

步骤S11,记录在被测试对象的开始位置插入的入口断点的位置,以及在该被测试对象的结束位置插入的出口断点的位置;

在实际应用中,中断是一种可恢复的陷阱型异常,可以将其称为断点异常,该断点异常的恢复需要从引发断点异常的那条指令的下一条指令开始执行。因此,当需要对某一程序或某一段代码进行性能测试时,本申请可以在该程序或该段代码的开始位置和结束位置分别插入断点,以使系统能够得知需要对什么进行测试。

具体的,本申请可以通过在上述被测试对象(如某一个程序或一段代码等等)的开始位置和结束位置写入int3指令,以使被测试对象运行到该位置时,系统能够及时识别到此处设置了断点,但并不局限于这一种断点设置方式,本实施例仅以此为例进行说明。

按照上述方式插入断点之后,为了描述方便,本申请可以将在被测试对象的开始位置插入的断点记为入口断点,将在被测试对象的结束位置插入的断点记为出口断点,此时,将入口断点的位置以及出口断点的位置记录下来,以便后续调用。

其中,入口断点的位置以及出口断点的位置具体可以包括对应指令的地址等。

步骤S12,捕获被测试对象运行过程中触发的断点异常;

需要说明的是,该断点异常可能包括本申请插入的断点引起的异常,也可能包括由于其他位置断点或其他因素引起的断点异常,因此,本申请在捕获到断点异常后,需要验证其是否是由于本申请插入的断点引起的断点异常,以保证据此对被测试对象的性能测试结果的准确性。

步骤S13,基于获得的与入口断点的位置匹配的断点异常的属性信息,以及与出口断点的位置匹配的断点异常的属性信息,获得被测试对象的性能测试结果。

其中,断点异常的属性信息可以包括发生断点异常的时间、地址、异常向量等等,在需要测试该被测试对象的运行时间的情况下,本申请可以直接获取发生断点异常的时间。

在实际应用中,本申请可以在捕获到与入口断点的位置匹配的断点异常时,获得此时系统时间,并将其作为该断点异常的属性信息;同理,在捕获到与出口断点的位置匹配的断点异常时,也可以获得此时的系统时间,并将其作为此时捕获到的断点异常的属性信息。

可选的,本申请也可以在捕获到与入口断点的位置匹配的断点异常时,触发计时器开始计时,直至捕获到与出口断点的位置匹配的断点异常结束计时,在这种情况下,可以将该计时器输出的时间作为捕获到的相应的断点异常的属性信息。

需要说明的是,关于上述断点异常的属性信息的获取方式并不局限于上述列举的方式,其可以根据实际需要属性信息的类型确定,本申请在此不再一一列举。

基于此,在实际应用中,为了获得被测试对象的运行时间,可以直接获取与入口断点的位置匹配的断点异常对应的第一时间,以及与出口断点的位置匹配的断点异常的第二时间,之后,计算该第一时间与第二时间的时间差,从而得到被测试对象的运行时间,

其中,结合上述描述,第一时间和第二时间可以是系统时间,也可以是计时器输出的时间等,需要说明的是,无论是系统时间还是计时器输出的时间,都是会随着被测试对象的运行而相应改变,以使该时间能够表示被测试对象的运行进度。

综上所述,本申请采用在需要进行性能测试的被测试对象中插入断点的方式,来获得因插入断点引起的断点异常的属性信息,进而据此实现对该被测试对象的性能测试,不需要修改代码源码,也不用依赖客户端的操作系统或专门的测试工作,操作非常简便,提高了测试效率;而且,本申请这种插入断点的方式能够对任意一段或几段代码进行测试,并不局限于整个程序代码,应用更加灵活,适用范围更广。

可选的,在上述步骤S11之前,为了实现断点的设置,本申请可以基于被测试对象的测试需求,生成断点插入请求,使得该断点插入请求包括插入断点的位置信息,如上述被测试对象的开始位置和结束位置,但并不局限于此。这样,当获得该断点插入请求后,可以根据其包含的插入断点的位置信息,在被测试对象的开始位置插入入口断点,并在该被测试对象的结束位置插入出口断点。

仍以上述int3指令为例,由于其二进制可以表示为0xCC,所以,当确定被测试对象需要插入断点的位置后,可以将该位置对应的指令第一个字节修改为0xCC。例如,确定需要插入断点的位置对应的指令如下:

int b=2;

C7 45 F8 02 00 00 00 mov dword ptr[b],2

那么,插入断点后,该指令将变为:

CC 45 F8 02 00 00 00

在实际运行过程中,可以通过检测当前运行指令的第一个字节,来判断此时是否发生断点异常,也就是说,一旦运行到插入断点的指令将会触发断点异常。

由此可见,如果要统计一段代码之间的执行时间,可以先确定该代码段即被测试对象的开始和结束位置,而在实际应用中,通常给出的是一个函数或整个程序代码的开始或结束位置,所以,本申请可以利用预存的符号表来确定被测试对象的开始位置和结束位置。

具体的,为了获得被测试对象的开始位置和结束位置,本申请实施例提供了另一种性能测试方法的流程图,结合上述图1所示的实施例流程,参照图2,该方法可以包括:

步骤S21,利用预存的符号表,查询加载被测试对象的相对偏移位置以及所述被测试对象的指令条数;

其中,预存的符号表可以是操作系统的pdb符号表,但并不局限于此,根据实际需要,其通常可以包括各地址或位置对应的指令的相对偏移位置(RVA)及其函数块大小即包含的指令条数,以及名称等等。

步骤S22,根据当前加载被测试对象的基地址以及相对偏移位置,确定被测试对象的开始位置;

在实际应用中,对于运行的被测试对象,通常需要加载到内存块中,而该内存块加载任何程序代码时通常都有一定的基地址,所以,本申请在加载被测试对象时,可以利用该基地址以及获得的相对偏移位置,经过简单的加减法运算,计算得到该被测试对象的起始地址即起始位置。

步骤S23,利用被测试对象的开始位置及其指令条数的二进制范围,计算得到被测试对象的结束位置。

其中,根据被测试对象包含的指令条数的二进制范围,可以确定该被测试对象所占内存地址,这样,在得知被测试对象的起始地址的情况下,将其所占用的内存地址加上该起始地址,就能够得知该被测试对象的结束位置。当然,也可以通过distorm函数库反汇编被测试对象地址,寻找对应的RET指令,得到被测试对象的返回地址即结束位置。

此时,若需要测试该测试对象的运行时间,可以按照上述方式修改其起始地址指令的第一个字节为0xCC,并修改所有结束地址指令的第一个字节为0xCC。

下面将以测试函数或某一段程序代码等被测试对象的运行时间为例,来实现该被测试对象的性能测试,如图3所示,为本申请实施例提供的又一种性能测试方法的流程图,结合上述图1和2实施例描述的流程,该方法可以包括:

步骤S31,获得断点插入请求;

其中,该断点插入请求可以包括插入断点的位置信息,如被测试对象的开始位置和结束位置等等。

可选的,在实际应用中,设置断点之前,可以先判断当前是否已经确定被测试对象的开始位置和结束位置,也就是说,判读当前是否需要对某一段程序代码进行性能测试,如果需要,才会按照上述方式设置断点;若不需要,将结束性能测试流程。

步骤S32,根据该断点插入请求中的插入断点的位置信息,在被测试对象的开始位置插入入口断点,并在该被测试对象的结束位置插入出口断点。

在本实施例的实际应用中,可以参照上述方式确定被测试对象的开始位置以及结束位置,并在相应位置插入断点,本实施例在此不再赘述。

需要说明的是,在插入断点之前,需要保存将要插入断点的指令的第一个字节的内容,以便恢复该指令的第一个字节时调用。

步骤S33,记录在被测试对象的开始位置插入的入口断点的位置,以及在被测试对象的结束位置插入的出口断点的位置;

步骤S34,捕获该被测试对象运行过程中触发的断点异常;

步骤S35,验证捕获到的断点异常的位置是否与记录的入口断点的位置或出口断点的位置匹配,如果捕获到的断点异常的位置与记录的入口断点的位置匹配,进入步骤S36;如果捕获到的断点异常的位置与记录的出口断点的位置匹配,执行步骤S38;如果捕获到的断点异常的位置与记录的入口断点的位置和出口断点的位置都不匹配,返回步骤S34;

步骤S36,在捕获到的断点异常的位置中添加入口标识;

需要说明的是,本申请对该入口标识的具体内容不作限定,只要能够据此识别出该断点异常的位置是预先插入的断点的位置即可。

步骤S37,获取捕获到断点异常的当前时间,并将其作为第一时间进行记录,返回步骤S34。

如上述实施例的描述,该当前时间可以是系统时间,也可以是计时器的时间,对于后者,可以在捕获到断点异常触发该计数器工作,从而获得该计时器输出的当前时间。

步骤S38,检测捕获到断点异常之前的位置中是否存在入口标识,若存在,进入步骤S39,若不存在,返回步骤S34;

在这种情况下,即捕获到的断点异常是由于插入的出口断点引起的,那么,此时,可以检测在此之前是否已经捕获到了因插入的入口断点引起的断点异常,本实施例可以基于上述入口标识进行检测。

由于在捕获到的断点异常的位置中添加入口标识后,可以将添加入口标识后的断点异常的位置存储起来,因此,本实施例可以通过查询存储器确定本次捕获到断点异常之前是否已经存储了入口标识,即在本次捕获到断点异常之前是否有插入的入口断点。

需要说明的是,关于对捕获到的断点异常的位置中添加的入口标识,通常会在完成本次测试后清除,所以,当查询存储器时通常不会查找到多个入口标识。

步骤S39,获取捕获到断点异常的当前时间,并将其作为第二时间进行记录;

本实施例中,该第二时间与上述第一时间的获取方式相同,在此不再详述。

步骤S310,计算第二时间与第一时间的时间差,得到被测试对象的运行时间;

步骤S311,清除被测试对象中存在的入口标识;

如上述描述,为了避免影响对下一次测试或对该被测试对象的其他性能测试,得到本次测试的时间差,即本次测试中被测试对象的运行时间后,可以清除在上述断点异常的位置中添加的入口标识。

可选的,在得到本次测试的时间差后,还可以将对被测试对象的运行时间的测试次数增加一次,并计算对该被测试对象完成的所有测试次数所得时间差的总时间。

步骤S312,判断对被测试对象的测试次数是否达到预设测试阈值,若是,进入步骤S313;如果否,返回步骤S31。

步骤S313,利用各次测试计算得到的时间差的总时间以及测试总次数,计算每次测试的平均时间,并将该平均时间作为被测试对象的运行时间。

在本实施例中,为了提高对被测试对象的性能测试结果的准确性,可以对该被测试对象进行多次测试,以便将所得平均测试结果作为该被测试对象的性能测试结果;当然,根据具体测试性能的不同,也可以只进行一次测试即可,本申请对测试次数不作具体限定,即对该预设测试阈值的具体数值不作限定。

综上所述,当需要对某一段程序代码即上述被测试对象的运行时间进行测试时,本申请可以通过在该代码段的开始位置和结束位置都插入断点,从而利用捕获到因插入的断点引起的断点异常对应的时间,计算该代码段的运行时间,且还可以通过对该代码段进行多次测试,将得到的平均时间差作为该代码段的运行时间。由此可见,本申请能够实现对任意代码段的运行时间的测试,非常灵活且方便实用;而且,该测试过程不需要修改代码源码,也不用依赖客户端的操作系统或专门的测试工作,操作非常简便,提高了测试效率。

可选的,在上述步骤S34之后,可以先验证捕获到的断点异常的位置是否与记录的入口断点的位置匹配,如果匹配,执行上述步骤S36;如果不匹配,再验证捕获到的断点异常的位置是否与记录的出口断点的位置匹配,如果匹配,执行步骤S38;如果仍然不匹配,则可以返回步骤S34继续捕获该被测试对象运行过程中触发的断点异常,具体实现过程可以结合上述实施例对应部分的描述,本实施例在此不再赘述。

作为本申请另一实施例,在上述实施例的基础上,在捕获到被测试对象运行过程中触发的断点异常,为了保证被测试对象的继续运行,需要对该断点异常进行处理,并在处理该断点异常后,指向该断点异常的下一个指令运行,具体可以将标志寄存器减1,此时,还可以利用预存的被测试对象的开始位置对应指令的第一个字节或结束位置对应指令的第一个字节,恢复捕获到的断点异常对应指令的第一个字节,即取消设置的断点,之后,重置标志寄存器的TF标志位,并按照单步执行策略继续运行被测试对象。

由此可见,完成对被测试对象的一次测试后,会将开始测试前设置的断点取消,以便重置断点进行第二次的测试,如此循环,以实现对被测试对象的多次测试。

其中,标志寄存器的TF标志位置1则开启单步执行调试模式,置0则关闭该单步执行调试模式,在该单步执行调试模式下,处理器在每条指令后产生一个调试异常,这样在每条指令执行后都可以查看执行程序的状态。基于此,在实际测试过程中,由于每引发一次终端,通常会将上述标志寄存器的TF标志位置0,所以,当需要进行单步执行时,需要重置该TF标志位,即将该TF标志位置1,但并不局限于此。

如图4所示,为本申请实施例提供的一种性能测试系统的结构框图,该系统可以包括:

存储模块41,用于记录在被测试对象的开始位置插入的入口断点的位置,以及在所述被测试对象的结束位置插入的出口断点的位置;

其中,关于在被测试对象的开始位置和结束位置插入断点的具体过程可以参照上述方法实施例对应部分的描述,本实施例在此不再赘述。

异常捕获模块42,用于捕获所述被测试对象运行过程中触发的断点异常;

处理模块43,用于基于获得的与所述入口断点的位置匹配的断点异常的属性信息,以及与所述出口断点的位置匹配的断点异常的属性信息,获得所述被测试对象的性能测试结果。

可选的,当需要测试被测试对象的运行时间,具体如一代码段的运行时间时,上述获得的断点异常的属性信息可以包括捕获到该断点异常的时间,基于此,可以利用两次捕获到的因插入断点而引起的断点异常的时间,计算该被测试对象的运行时间。

基于此,该处理模块43可以包括:

时间获取单元,用于获取与所述入口断点的位置匹配的断点异常对应的第一时间,以及与所述出口断点的位置匹配的断点异常的第二时间;

其中,该第一时间和第二时间可以是系统时间,也可以是计时器输出的时间等,本申请对其获取来源不作限定。

计算单元,用于计算所述第一时间与所述第二时间的时间差,得到所述被测试对象的运行时间。

由此可见,在本实施例中,通过插入断点的方式,能够实现对任意代码即上述被测试对象的运行时间的测试非常灵活且方便实用,而且,测试过程不需要修改代码源码,也不用依赖客户端的操作系统或专门的测试工作,操作非常简便,提高了测试效率。

作为本申请另一实施例,在实际应用中,如图5所示,上述时间获取单元可以包括:

验证单元431,用于验证捕获到的断点异常的位置是否与记录的所述入口断点的位置或所述出口断点的位置匹配;

第一记录单元432,用于当捕获到的断点异常的位置与记录的所述入口断点的位置匹配,在捕获到的断点异常的位置中添加入口标识,并将捕获到断点异常的当前时间作为第一时间记录,并触发所述异常捕获模块继续捕获所述被测试对象运行过程中触发的断点异常;

检测单元433,用于当捕获到的断点异常的位置与记录的所述出口断点的位置匹配,检测捕获到断点异常之前的位置中是否存在入口标识,如果不存在,触发所述异常捕获模块继续捕获所述被测试对象运行过程中触发的断点异常;

第二记录单元434,用于当捕获到断点异常之前的位置中存在入口标识,将捕获到断点异常的当前时间作为第二时间记录。

可选的,为了在对被测试对象设置断点,如图6所示,该系统还可以包括:

获取模块44,用于获得断点插入请求,所述断点插入请求包括插入断点的位置信息;

在实际应用中,该获取模块44可以包括:

查询单元,用于利用预存的符号表,查询加载被测试对象的相对偏移位置以及所述被测试对象的指令条数;

第一位置计算单元,用于根据当前加载所述被测试对象的基地址以及所述相对偏移位置,确定所述被测试对象的开始位置;

第二位置计算单元,用于利用所述被测试对象的开始位置以及所述被测试对象的指令条数的二进制范围,计算得到所述被测试对象的结束位置

断点插入模块45,用于根据所述断点插入请求中的插入断点的位置信息,在被测试对象的开始位置插入入口断点,并在所述被测试对象的结束位置插入出口断点。

进一步地,为了提高对被测试对象的性能测试结果,在上述各实施例的基础上,如图6所示,系统还可以包括:

标识清除模块46,用于在计算得到第一时间与第二时间的时间差后,清除被测试对象中存在的入口标识;

平均时间计算模块47,用于当判断对所述被测试对象的测试次数达到预设测试阈值,利用各次测试计算得到的所述时间差的总时间以及测试总次数,计算每次测试的平均时间,并将所述平均时间作为所述被测试对象的运行时间。

另外,在上述各实施例的基础上,需要对捕获到的断点异常进行处理,基于此,系统还可以包括:

异常处理模块,用于处理所述断点异常,并指向所述断点异常的下一指令运行;

断点恢复模块,用于利用预存的所述被测试对象的开始位置对应指令的第一个字节或结束位置对应指令的第一个字节,恢复捕获到的断点异常对应指令的第一个字节;

单步调试模块,用于重置标志寄存器的TF标志位,并按照单步执行策略继续运行所述被测试对象。

上文描述的是性能测试系统的软件功能模块构架,对于该系统的硬件结构,可以参照图7所示:

图7为本申请实施例提供的一种性能测试系统的硬件结构框图,如图7所示,该系统可以包括:处理器71、存储器72、显示器73、通信接口74以及通信总线75;

其中,处理器71、存储器72、显示器73以及通信接口74通过通信总线75完成相互间的通信。

可选的,该通信接口74可以是USB接口或者其他串口等等。

处理器71,用于执行程序;

存储器72,用于存放程序以及获得的各种数据等;

显示器73,可以用于显示性能测试结果以及测试过程等;

在本实施例中,该处理器71可以是中央处理器CPU,或者是特定集成电路ASIC(Application Specific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。

存储器72可以包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器等。

其中,上述程序可具体用于:

记录在被测试对象的开始位置插入的入口断点的位置,以及在所述被测试对象的结束位置插入的出口断点的位置;

捕获所述被测试对象运行过程中触发的断点异常;

基于获得的与所述入口断点的位置匹配的断点异常的属性信息,以及与所述出口断点的位置匹配的断点异常的属性信息,获得所述被测试对象的性能测试结果。

需要说明的是,关于该程序执行对被测试对象的性能测试的具体过程可以参照上述方法实施例对应部分的描述,本实施例在此仅以对被测试对象的运行时间的测试为例进行说明。

也就是说,上述程序在捕获被测试对象运行过程中触发的断点异常后,具体可以用于:

验证捕获到的断点异常的位置是否与记录的所述入口断点的位置或所述出口断点的位置匹配;

当捕获到的断点异常的位置与记录的所述入口断点的位置匹配,在捕获到的断点异常的位置中添加入口标识,并将捕获到断点异常的当前时间作为第一时间记录,继续捕获所述被测试对象运行过程中触发的断点异常;

当捕获到的断点异常的位置与记录的所述出口断点的位置匹配,检测捕获到断点异常之前的位置中是否存在入口标识;

如果不存在,继续捕获所述被测试对象运行过程中触发的断点异常;

如果存在,将捕获到断点异常的当前时间作为第二时间记录;

计算所述第一时间与所述第二时间的时间差,并清除所述被测试对象中存在的入口标识;

当判断对所述被测试对象的测试次数达到预设测试阈值,利用各次测试计算得到的所述时间差的总时间以及测试总次数,计算每次测试的平均时间,并将该平均时间作为被测试对象的运行时间。

综上,本申请实施例能够简便、灵活地实现对被测试对象的性能测试。

此外,需要说明的是,关于上述各实施例中,诸如第一、第二等之类的关系术语仅仅用来将一个操作、单元或模块与另一个操作、单元或模块区分开来,而不一定要求或者暗示这些单元、操作或模块之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法或者系统中还存在另外的相同要素。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法对应,所以描述的比较简单,相关之处参见方法部分说明即可。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1