CN101620549A - 一种性能分析方法及装置 - Google Patents
一种性能分析方法及装置 Download PDFInfo
- Publication number
- CN101620549A CN101620549A CN200910165225A CN200910165225A CN101620549A CN 101620549 A CN101620549 A CN 101620549A CN 200910165225 A CN200910165225 A CN 200910165225A CN 200910165225 A CN200910165225 A CN 200910165225A CN 101620549 A CN101620549 A CN 101620549A
- Authority
- CN
- China
- Prior art keywords
- key code
- timestamp
- professional
- working time
- response message
- 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
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种性能分析方法,该方法包括:向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;接收系统返回的带有时间戳的应答消息;分析所述带有时间戳的应答消息,统计各运行关键代码所花费的时间,完成性能分析。能够在不影响系统正常运行的情况下实现对系统性能进行分析。
Description
技术领域
本发明涉及信息处理领域,特别是涉及一种性能分析方法及装置。
背景技术
对于大容量,高并发的系统程序经常存在以下主要的性能瓶颈问题:系统运行效率不高,单笔响应时间不够迅速,不能达到产品的设计性能指标。为了能够优化系统性能,需要进行性能分析,以帮助程序员发现具体哪些环节存在处理时间过长、运行效率不高,并对系统进行有针对性地改进。
现有技术中,linix具有自带的性能分析工具Oprofile,该oprofile是利用CPU提供的性能计数功能对系统进行性能分析。CPU提供一些性能计数器,经过配置可以对各种事件进行计数,当超过一定的值后会发出NMI中断,中断处理程序可以记录下当前的任务状态信息,这样用户可以对其进行分析。
oprofile可以深入到指令一级,主要用于系统调优,对于程序员和系统管理员都是一个查找系统瓶颈的不错的工具。但是Oprofile采用采样技术,监控采样期间代码运行情况,而采样本身需要耗费CPU资源,往往会对系统性能带来很大的影响,导致处理能力降低,在一些大容量,高并发情况下,甚至可能使得程序运行性能大幅度下降,因此,采样数据不可避免会失真,采样所得的可信度下降,影响性能分析的准确性。
发明内容
有鉴于此,本发明的目的在于提供一种性能分析方法及装置,能够在不影响系统正常运行的情况下实现对系统性能进行分析。
为实现上述目的,本发明提供了如下方案:
一种性能分析方法,包括:
向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
接收系统返回的带有时间戳的应答消息;
分析所述带有时间戳的应答消息,统计运行各关键代码所花费的时间,完成性能分析。
优选的,所述时间戳域为数组型,所述系统的各关键代码在返回应答消息时加入时间戳包括:
系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,形成时间戳链。
优选的,所述统计各运行关键代码所花费的时间之后还包括:
对运行时间大于预置阈值的关键代码进行标记,定位出运行时间最大的关键代码。
优选的,还包括:
保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;
将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。
优选的,还包括:
分析出并发执行多笔业务时的运行时间高于执行单笔业务时的运行时间达到预置阈值的关键代码;
判断所述分析出的关键代码运行时间的延长是否正常,如果不正常,则对所述关键代码进行标记,以便于定位出系统的性能恶化点。
一种性能分析装置,包括:
发送单元,用于向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
接收单元,用于接收系统返回的带有时间戳的应答消息;
第一分析单元,用于分析所述带有时间戳的应答消息,统计运行各关键代码所花费的时间,完成性能分析。
优选的,所述时间戳域为数组型,所述系统的各关键代码在返回应答消息时加入时间戳包括:
系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,形成时间戳链。
优选的,还包括:
第一标记单元,用于对运行时间大于预置阈值的关键代码进行标记,定位出运行时间最大的关键代码。
优选的,还包括:
保存单元,用于保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;
比对单元,用于将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。
优选的,还包括:
第二分析单元,用于分析出并发执行多笔业务时的运行时间高于执行单笔业务时的运行时间达到预置阈值的关键代码;
第二标记单元,用于判断所述分析出的关键代码运行时间的延长是否正常,如果不正常,则对所述关键代码进行标记,以便于定位出系统的性能恶化点。
根据本发明提供的具体实施例,本发明公开了以下技术效果:
本发明可以向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;接收系统返回的带有时间戳的应答消息;分析所述带有时间戳的应答消息,统计各运行关键代码所花费的时间,完成性能分析。由于在完成性能分析的过程中不需要采样技术,因此,能够在不影响系统正常运行的情况下实现对系统性能进行分析。
另外,本发明实施例还可以将系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息进行对比分析,便于找出大并发时的性能恶化点。
附图说明
图1是本发明实施例提供的方法的流程图;
图2是本发明实施例提供的另一方法的流程图;
图3是本发明实施例提供的装置的示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
参见图1,本发明实施例提供的性能分析方法包括以下步骤:
S101:向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
S102:接收系统返回的带有时间戳的应答消息;
S103:分析所述带有时间戳的应答消息,统计运行各关键代码所花费的时间,完成性能分析。
本发明实施例旨在通过获取系统中的关键代码的运行时间,来分析系统的性能。通常的系统程序代码中,在一些代码的关键点都有对时间戳的判断,但是如果原始消息中不存在时间戳域,则不会返回时间戳信息。
为此,本发明实施例首先需要定义一个时间戳域,在向系统发送请求消息时,可以发送带有时间戳域的请求消息,系统的各关键代码在收到带有时间戳域的请求消息后,便可以自动在响应消息中加入时间戳。这样,请求发出者最终接收到的就将是带有各关键代码时间戳的响应消息,通过分析各关键代码的时间戳,就可以分析出各关键代码的运行时间。
其中,关键代码打的时间戳是代码运行开始及结束时间的时间点,即在某段关键代码运行开始和结束都分别打时间戳,并将带有时间戳的应答消息返回给调用给关键代码的上级代码。
需要说明的是,所述关键代码通常是指需要进行函数或服务调用的代码,例如,假设在执行一条请求消息时,请求发出者需要调用函数A,函数A需要调用函数B,函数B还需要调用函数C,则函数A、函数B及函数C都是关键代码。
另外需要说明的是,每个函数在执行完毕之后,都会向上级调用返回响应消息(具体的,如果成功完成业务处理,则返回成功消息,否则返回业务处理出错消息),当前函数在收到响应消息之后,再将该响应消息返回给其上级调用,直到返回给请求发出者(如客户端)。例如,在前述例子中,函数C在运行结束之后,需要向函数B返回响应消息,函数B在运行结束之后,还需要将该响应消息返回给函数A,最终函数A在运行结束之后,再将该响应消息返回给客户端。
也就是说,请求发出者最终会收到一条响应消息,该响应消息是由各级关键代码一级一级地返回到请求发出者的。
在本发明实施例中,由于请求消息中带有时间戳域,因此,各关键代码需要打时间戳,仍以前述例子为例,参见图2,具体的打时间戳的过程可以是:
S201:客户端调用函数A;
S202:函数A在开始运行时,打函数A的开始时间戳;
S203:在函数A运行期间调用函数B;
S204:函数B在开始运行时,打函数B的开始时间戳;
S205:在函数B运行期间还需要调用函数C;
S206:函数C在运行开始时,打函数C的开始时间戳;
S207:在函数C运行结束时,打函数C的结束时间戳;
S208:将函数C的开始时间戳和结束时间戳携带在响应消息中,返回给函数B;
S209:函数B在执行完毕时,打函数B的结束时间戳;
S210:将函数B的开始时间戳及结束时间戳携带在从函数C接收到响应消息中,返回给函数A;
S211:函数A在运行结束时,打函数A的结束时间戳;
S212:将函数A的开始时间戳及结束时间戳携带在从函数B接收到响应消息中,返回给客户端。
这样,客户端最终接收到的响应消息中带有函数A、函数B及函数C的运行开始及结束时间戳组成的时间戳链,同时,时间戳链中会包含时间戳与函数之间的对应关系(即哪个时间戳是哪个函数打的);分别用各函数的结束时间减去开始时间,就得到了各函数的运行时间。然后就可以通过分析运行时间的长短来分析系统的性能。
在获知各关键代码的运行时间之后,可以对运行时间大于预置阈值的关键代码进行标记,形成报告提供给编程人员,便于编程人员定位出运行时间最大的关键代码。
其中,由于时间戳域是新定义的,因此在定义时间戳域时需要注意以下问题:
系统程序通常能够处理固定的消息格式,例如,金融基础件2.0处理的消息格式采用类似FIX(Financial Information exchange)的协议格式:
TAG1=VALUE1|TAG2=VALUE2|...TAG3=VALUE3|
上例中,以“|”是各个域的区隔符。其中,所述域就是指各个字段,每一个字段具体的代表某种类型的数据,例如,定义了一个功能号字段:TAG_FUNCTIONID,那么就可以通过在每条消息中添加TAG_FUNCTIONID域的值来表明该消息所需要执行的功能。
因此,在定义时间戳域时,可以按照上述消息格式进行定义。例如,针对各个域,可以定义为普通类型的值,这是一种最简单的阈值形式,可以表示为TAG=VALUE|;并且在VALUE中,不允许出现区隔符。
普通域一般用在一些简单的字段中,例如只要一个数字或者一个字符串就可以描述清楚的字段,如功能号字段,由于只需要一个简单的数字(就是功能号)就可以描述,所以就可以将TAG_FUNCTIONID定义成一个普通域,又如一个客户的名称,只需要一个字符串就可描述清楚,所以也可以将客户名称域定义成普通域。
或者,也可以将各个域定义为rawda ta型,可以表示为TAG_RAWDATALEN:表明rawdata内容的长度。
表述如下(为方便显示,这里以“|”作为域区隔符):
TAG_RAWDATALEN=4|TAG=xxxx|
TAG_RAWDATALEN=4表示后续的TAG是个rawdata型,并且,域内容的长度是4个字节。这4个字节并不包含域值以及“=”以及后面一个分隔符“|”。xxxx就是该域的实际的内容。
一般来说,rawdata域用在二进制数据中,例如,如果需要传输音视频流数据,由于在二进制数据中会包含任意值,当然也可能会包含内部定义的区隔符,所以必须定义一个rawdata类型的域来描述。
再者,还可以将各个域定义为数组型,这种类型可以表示为:
TAG_ARRAYLEN:表明后续TAG是数组形式,域TAG_ARRAYLEN给出数组内有几项.
表述如下(为方便显示,这里以“|”作为域区隔符):)
TAG_ARRAYLEN=4|TAG=value1|value2|value3|value4|
综上可以看出,普通型和rawdata型都只能记录一个值,也就是说,如果上一时刻在这种域中填入了一个值,则下一时刻再向这种域填入值时,需要将上一时刻的值替换掉,最终记录的仅是当前值。
但是如前文所述,由于本发明实施例需要记录的是各关键代码的时间戳组成的时间戳链,可见,普通型和rawdata型都不适合本发明实施例。
而数组型的域是可以记录多个值,因此,本发明实施例中定义的时间戳域可以采用数组型,这样系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,并最终形成时间戳链。
具体实现时,可以开发一个客户端程序(该程序是一个管理客户端),该客户端程序可以发送出带有时间戳域的请求消息,这样就可以触发金融基础件等系统程序的每个关键代码都加入时间戳。当应答消息回到客户端后,分析所有的时间戳就可以清楚哪部分代码有改善的余地(或者说修改哪部分代码对整体性能提升最明显)。
前文所述描述了系统性能瓶颈的一方面因素,在实际应用中,系统的性能瓶颈还可能存在以下问题:系统在执行单笔业务或压力较小的情况下,性能良好,但是如果是业务并发量增加时,系统的性能可能会显著恶化。本发明实施例也可以从上述角度对系统进行性能分析。
例如,保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。对比报告中记录的是对于同一段关键代码,系统在执行单笔业务及并发执行多笔业务时,运行时间的对比。通常,与执行单笔业务相比,并发执行多笔业务时,同一段关键代码的运行时间会延长,分析延长的程度,就可以判断出造成性能恶化的原因。
具体的,可以在系统没有压力的情况下,发送带时间戳的请求消息,系统返回应答消息后,将应答消息中的时间戳保存为一个文件,如file1。然后,启用压力客户端(如loadrunner)加压,使得系统程序的性能开始恶化,这时,再向系统发送带时间戳的请求消息,系统返回应答消息后,同样将该应答消息中的时间戳保存成一个文件,如file2。最后,通过管理客户端程序对两个时间戳文件file1,file2进行分析,找出在单笔和压力测试的情况下这两个文件显示的处理时间显著延长部分,并分析该延长是否正常,通过这种分析就可以定位出代码的性能恶化点。
与本发明实施例提供的性能分析方法相对应,本发明实施例还提供了一种性能分析的装置,参见图3,该装置包括:
发送单元U301,用于向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
接收单元U302,用于接收系统返回的带有时间戳的应答消息;
第一分析单元U303,用于分析所述带有时间戳的应答消息,统计各运行关键代码所花费的时间,完成性能分析。
具体的,所述时间戳域可以为数组型,所述系统的各关键代码在返回应答消息时加入时间戳包括:
系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,形成时间戳链。
为了使编程人员更容易找到运行时间最长的关键代码,该装置还可以包括:
第一标记单元U304,用于对运行时间大于预置阈值的关键代码进行标记,定位出运行时间最大的关键代码。
为了能够对大并发时的性能进行分析,该装置还可以包括:
保存单元U305,用于保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;
比对单元U306,用于将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。
同样为了便于编程人员快速找到系统的性能恶化点,该装置还可以包括:
第二分析单元U307,用于分析出并发执行多笔业务时的运行时间高于执行单笔业务时的运行时间达到预置阈值的关键代码;
第二标记单元U308,用于判断所述分析出的关键代码运行时间的延长是否正常,如果不正常,则对所述关键代码进行标记,以便于定位出系统的性能恶化点。
以上对本发明所提供的一种性能分析的方法及装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1、一种性能分析方法,其特征在于,包括:
向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
接收系统返回的带有时间戳的应答消息;
分析所述带有时间戳的应答消息,统计运行各关键代码所花费的时间,完成性能分析。
2、根据权利要求1所述的方法,其特征在于,所述时间戳域为数组型,所述系统的各关键代码在返回应答消息时加入时间戳包括:
系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,形成时间戳链。
3、根据权利要求1所述的方法,其特征在于,所述统计运行各关键代码所花费的时间之后还包括:
对运行时间大于预置阈值的关键代码进行标记,定位出运行时间最大的关键代码。
4、根据权利要求1所述的方法,其特征在于,还包括:
保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;
将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。
5、根据权利要求4所述的方法,其特征在于,还包括:
分析出并发执行多笔业务时的运行时间高于执行单笔业务时的运行时间达到预置阈值的关键代码;
判断所述分析出的关键代码运行时间的延长是否正常,如果不正常,则对所述关键代码进行标记,以便于定位出系统的性能恶化点。
6、一种性能分析装置,其特征在于,包括:
发送单元,用于向系统发送带有时间戳域的请求消息,以触发系统的各关键代码在返回应答消息时加入时间戳;
接收单元,用于接收系统返回的带有时间戳的应答消息;
第一分析单元,用于分析所述带有时间戳的应答消息,统计运行各关键代码所花费的时间,完成性能分析。
7、根据权利要求6所述的装置,其特征在于,所述时间戳域为数组型,所述系统的各关键代码在返回应答消息时加入时间戳包括:
系统的各关键代码分别将时间戳加在时间戳域数组的最后一项,形成时间戳链。
8、根据权利要求6所述的装置,其特征在于,还包括:
第一标记单元,用于对运行时间大于预置阈值的关键代码进行标记,定位出运行时间最大的关键代码。
9、根据权利要求6所述的装置,其特征在于,还包括:
保存单元,用于保存系统执行单笔业务及并发执行多笔业务时分别返回的带有时间戳的应答消息;
比对单元,用于将所述保存的带有时间戳的应答消息进行分析比较,统计出系统执行单笔业务及并发执行多笔业务时,各关键代码的运行时间,形成对比报告。
10、根据权利要求9所述的装置,其特征在于,还包括:
第二分析单元,用于分析出并发执行多笔业务时的运行时间高于执行单笔业务时的运行时间达到预置阈值的关键代码;
第二标记单元,用于判断所述分析出的关键代码运行时间的延长是否正常,如果不正常,则对所述关键代码进行标记,以便于定位出系统的性能恶化点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910165225.1A CN101620549B (zh) | 2009-08-13 | 2009-08-13 | 一种性能分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910165225.1A CN101620549B (zh) | 2009-08-13 | 2009-08-13 | 一种性能分析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101620549A true CN101620549A (zh) | 2010-01-06 |
CN101620549B CN101620549B (zh) | 2014-03-19 |
Family
ID=41513797
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910165225.1A Active CN101620549B (zh) | 2009-08-13 | 2009-08-13 | 一种性能分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101620549B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103164327A (zh) * | 2011-12-12 | 2013-06-19 | 深圳市快播科技有限公司 | 程序运行效率分析方法及装置 |
CN103631701A (zh) * | 2013-12-04 | 2014-03-12 | 金蝶软件(中国)有限公司 | Erp性能检测的方法和装置 |
CN103678090A (zh) * | 2013-12-11 | 2014-03-26 | 北京国双科技有限公司 | 数据处理的监控方法和装置 |
CN104298570A (zh) * | 2014-11-14 | 2015-01-21 | 北京国双科技有限公司 | 数据处理方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1300699C (zh) * | 2004-09-23 | 2007-02-14 | 上海交通大学 | 并行程序可视化调试方法 |
CN101256531B (zh) * | 2008-04-08 | 2011-04-06 | 中兴通讯股份有限公司 | 一种分析嵌入式设备实时性的方法 |
-
2009
- 2009-08-13 CN CN200910165225.1A patent/CN101620549B/zh active Active
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103164327A (zh) * | 2011-12-12 | 2013-06-19 | 深圳市快播科技有限公司 | 程序运行效率分析方法及装置 |
CN103631701A (zh) * | 2013-12-04 | 2014-03-12 | 金蝶软件(中国)有限公司 | Erp性能检测的方法和装置 |
CN103631701B (zh) * | 2013-12-04 | 2018-01-30 | 金蝶软件(中国)有限公司 | Erp性能检测的方法和装置 |
CN103678090A (zh) * | 2013-12-11 | 2014-03-26 | 北京国双科技有限公司 | 数据处理的监控方法和装置 |
CN104298570A (zh) * | 2014-11-14 | 2015-01-21 | 北京国双科技有限公司 | 数据处理方法和装置 |
CN104298570B (zh) * | 2014-11-14 | 2018-04-06 | 北京国双科技有限公司 | 数据处理方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN101620549B (zh) | 2014-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110225417B (zh) | 数据处理方法及服务器、检测卡顿的方法及服务器 | |
CN107870849B (zh) | 测试日志的处理方法和装置 | |
CN109614433A (zh) | 业务系统间数据血缘的识别方法、装置、设备及存储介质 | |
CN101620549B (zh) | 一种性能分析方法及装置 | |
CN112434039A (zh) | 数据的存储方法、装置、存储介质以及电子装置 | |
EP2933726B1 (en) | Apparatus, system and method for application log data processing | |
CN109815092B (zh) | 云平台自动伸缩方法及系统 | |
CN110096419A (zh) | 接口日志的获取方法、接口日志管理服务器及业务服务器 | |
CN103955539B (zh) | 一种获取二进制协议数据中控制字段划分点的方法及装置 | |
CN101808351A (zh) | 业务影响分析方法和系统 | |
CN112800061B (zh) | 一种数据存储方法、装置、服务器及存储介质 | |
CN102609653A (zh) | 一种文件快速扫描方法和系统 | |
CN102056200A (zh) | 一种业务处理流程监控方法和系统 | |
CN112633761A (zh) | 指标数据的查询方法、装置、设备及存储介质 | |
CN111478806B (zh) | 一种链路追踪采样方法及系统 | |
EP4145290B1 (en) | Transactions impact analysis | |
CN110688369B (zh) | 解析db2报文的方法、装置、存储介质及电子设备 | |
CN111209266B (zh) | 一种基于Redis数据库的审计方法、装置及电子设备 | |
CN107291743B (zh) | 数据的调用方法和装置 | |
CN107306199B (zh) | 网元数据回放的方法和装置 | |
CN110442439B (zh) | 任务进程处理方法、装置和计算机设备 | |
CN110032432B (zh) | 实例的压缩方法和装置、实例的解压方法和装置 | |
CN108717438B (zh) | 一种链式数据状态采集系统及方法 | |
CN111193631B (zh) | 信息处理方法、系统和计算机可读存储介质 | |
CN116318990A (zh) | 一种攻击链实时检测方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |