Primitive Array Performance
就像你在基本类型的例子中所注意到的,那个例子并没有强调绑定层。如果你来回发送的只是基本类型的数据,那么基本类型的性能就被容器的性能隐藏了,比如说连接方面的处理,任务时序的安排,等等。这部分展示了当强调绑定层时基本的数组类型的执行情况。这是一种从容器层移到绑定层的一种放大透镜。(
This is a way of moving the magnifying lens from the container layer to the binding layer)
考虑下
WSDL Sample 2的代码。
WSDL Sample 2
<xsd:complexType name="intArray">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="types:echoInt"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element type="types:intArray" name="echoIntArray" />
<xsd:element type="types:intArray" name="echoIntArrayResponse" />
...
<message name="echoIntArraySoapIn">
<part name="params" element="types:echoIntArray" />
</message>
<message name="echoIntArraySoapOut">
<part name="result" element="types:echoIntArrayResponse" />
</message>
|
WSDL Sample 2
中的
WSDL
代码展示了发送跟接收整数类型数组。
Code Sample 2
显示了针对
JAX-RPC1.1
相应的
Web
服务代码。
Code Sample 2
public int[] echoInt(int[] params)
{
return params;
}
|
Code Sample 3
显示了针对
JAX-WS 2.0
而产生的代码。
Code Sample 3
public void echoIntArray(Holder<List<Integer>> echoInt)
{
}
|
Table 2展示了JAX-RPC 1.1跟JAX-WS 2.0之间在服务端点上,对于相应所产生的带有minOccurs和maxOccurs属性的XSD基本类型的不同Java数组类型的区别。
Table 2: Comparison of Primitive Arrays Generated in JAX-RPC 1.1 and JAX-WS 2.0 for the Corresponding XSD Types
|
|
XSD Type
|
JAX-RPC 1.1
|
JAX-WS 2.0
|
| ||
xsd:boolean
|
Boolean[]
|
List<Boolean>
|
xsd:short
|
Short[]
|
List<Short>
|
xsd:int
|
Int[]
|
List<Integer>
|
xsd:long
|
Long[]
|
List<Long>
|
xsd:integer
|
BigInteger[]
|
List<BigInteger>
|
xsd:float
|
Float[]
|
List<Float>
|
xsd:double
|
Double[]
|
List<Double>
|
xsd:decimal
|
BigDecimal[]
|
List<BigDecimal>
|
xsd:date
|
Java.util.calendar[]
|
List<Javax.xml.datatype.XMLGregorianCalendar>
|
xsd:time
|
Java.util.calendar[]
|
List<Javax.xml.datatype.XMLGregorianCalendar>
|
xsd:datetime
|
Java.util.calendar[]
|
List<Javax.xml.datatype.XMLGregorianCalendar>
|
|
注意到JAX-RPC 1.1所产生的带有索引的数组,而JAX-WS 2.0产生的是list接口。
图 5中的图表表现出了XSD基本数组类型上的性能。X轴指的XSD基本数组类型比如说元素类型为boolean,short等等的Array(size=100)。Y轴指示了吞吐量,每秒钟的处理事务。
图
5
:
基本数组类型性能
就像你所看到的,一旦你开始强调绑定层了,基本类型的性能就不同了。并且注意下 JAX-WS 2.0 在所有情况下都表现得更好并且可以看出来有很大的提高了――在某些情况下差不多是一倍多――在 date,time, 和 datetime 的情况下。 JAX-RPC 针对 datetime 的锁问题现在在 JAX-WS 2.0 已经被提出了。
图
5
展示了
JAX-WS 2.0
在性能上的提升。
Payload Performance
Web
服务性能是跟发送的有效载荷成正比的。你发送的有效载荷越多,对于序列化及反序列化来说就需要多处理更多的东西,还有绑定及解析。这些对性能上的影响是相当大的。
假设有一种情况,你必须发送并接收带有
Code Sample 4
中所表示的
item
结构的
items
。比如说,在一个供应链管理系统中,你会为了一个特殊的订单而请求
line items
来处理一批
items
。
Code Sample 4
# Item{
id,
description,
price,
inventory,
# location {
id,
description,
address,
},
creationdate
} ;
|
图
6
中的图表表明了
JAX-WS
的性能跟
JAX-RPC
相比在作为有效负荷大小百分比上――那就是说,
items
的数量――种类。
X
轴代表了发送跟接收的取决于
items
数量。在这个问题里
(
比如说一个
)
,一个事务被定义为发送与接收一个
itmes
的数组。
图
6
: Payload Performance
图6中的图表暗示出来了,在负载超过100个items后,JAX-WS的产出是JAX-RPC性能上的差不多两倍,而在负载不多于100个items的时候,JAX-WS和JAX
RPC结果是差不多的。一般来说,JAX-WS比JAX-RPC在更多的负载下表现得比JAX-RPC更好。
Binding Performanc
在Java的web服务中,有多种方式来处理XML文档。这部分比较了
document-handling JAXB
,
Document Oject Model(DOM)c
对于
XML
文档来说,性能上的区别,
100 kilobyte Universal Business Language (UBL) invoice.
JAXB Binding
JAXB绑定提供了一种从Java技术的对象到XML以及从XML到Java技术对象的转换方式。JAXB 绑定的语法在
WSDL Sample 3
中的示例体现了,在这里一个叫做
echoJAXB
的元素在
WSDL
代码的
Schema
部分指的是
InvoiceType
。这种途径也叫
shcema
绑定,因为产性的制品都是依赖于这个
schema
。
WSDL Sample 3
<xsd:element name="InvoiceType">
...
</xsd:element>
<xsd:element name="echoJAXB" type="types:InvoiceType" />
|
当在 Code Sample 5 中的 WSDL 代码使用 wscomplie 被编绎的时候,它在服务端点产生了 InvoiceType 的 Java 技术的对象。
Code Sample 5
public void echoSX(Holder<InvoiceType> invoice) {
}
|
JAXB绑定有几个优点:减轻了开发任务,隐藏了复杂代码,缺少了样板代码,而且比非schema绑定的具有更好的性能。所有开发人员都需要做的就是为访问XML内容而产生JAXB java类方法。
JAXB的一个缺点就是所产生的Java代码更加耦合于在WSDL中定义的schema,这使得JAXB绑定的途径对于写基本的代码更加难。
DOM Binding
DOM绑定提供了从一棵DOM树到XML和从XML到DODM树的转换。DOM树绑定的语法如
Code Sample 6
所示,在这里一个叫做
echoDOM
的元素在
WSDL
的
Schema
部分有一个
xsd:any
类型,它允许应用程序发送任意的
XML
数据。在
xsd:any
类型上的processContents="skip"属性意思是XML内容是不合法的。
这种方法也叫
nonschema binding
因为所产生的代码是不依赖于
shema
的。
Sample 4
<xsd:element name="echoDOM">
<xsd:complexType>
<xsd:sequence>
<xsd:any processContents="skip" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
|
当使用
wscompile
进行编绎时,在
WSDL Sample 4
中的代码就会在服务端点产生
DOM Element
,如
Code Sample 6
所示
code Sample 6
public EchoNSXResponse echoNSX(EchoNSX invoice) {
Element e = (Element)invoice.getAny();
EchoNSXResponse res = new EchoNSXResponse();
res.setAny(e);
return res;
}
|
DOM 绑定的优点就是它允许开发人员写更加基础和有可扩展性的程序。 DOM 绑定的缺点就是它需要开发人员依赖于 schema 写更加复杂的代码并且为了遍历一个 DOM 树需要开发人员写更多的模板文件
,这就会导致性能上的降底。
注意
Code Sample 6,
只有那些基础结构的性能被测量了(
infrastructural performance is measured
)而没有汲及到用户代码或者是业务逻辑上的代码。
在这种使用情况,
, a transaction is the sending and receiving of a 100 kilobyte UBL invoice XML document
如图
7
,
X
轴代表了绑定类型,
y
轴代表了吞吐量。注意:图
7
所示的图表是对端点的性能,也就意味着它测量的仅仅是服务器端的
web
服务栈。
图
7
:
绑定性能
|
图
7
所示的图表说明了
JAXB
绑定比
DOM
绑定表现地更好。而且,注意到
JAX-WS
的性能比
JAX-RPC
的性能好很多
.
另外,
JAX-WS
的性能在
DOM
绑定的情况下更有明显。
总结
|
总的来说:
取决于需求选择基本类型
—
比如说
digits, precision
的位数,等等――因为基本类型能够基于他们的使用影响到性能。
在负载量增大的情况下将会减少吞吐量,并且会对性能产生相当大的影响。
JAXB
绑定或者是
schema
绑定提供了比
DOM
或者是非
schema
绑定更加好的性能。
JAX-WS 2.0
比
JAX-RPC1.1
有更加好的绑定性能。
对于大的负载量来说,
JAX-WS 2.0
的性能大约是
JAX-RPC 1.1
的两倍。
For More Information
|
(完)