做了一个 Hessian, CXF, Spring httpinvoke 速度对比
时间消耗 cxf > spring httpinvoke > hessian
顺序调用1W次所耗时间
hessian | 2652-2922 |
spring httpinvoke | 4080-4949 |
cxf | 9732-10432 |
并发为10, 调用1W次所耗时间
hessian | 1625-1753 |
spring httpinvoke | 3165-3338 |
cxf | 5709-5863 |
当然, 都知道 cxf 和 hessian 实现以及应用场景不太一样, 但差这么多还是很意外的..
=============================================================
测试代码:
服务端
public class Param implements Serializable {
private static final long serialVersionUID = 7414597783500374225L;
private Integer i;
private String s;
private Long l;
private List<Param> list = new ArrayList<Param>();
private boolean b;
......
}
public class Result implements Serializable {
private static final long serialVersionUID = 2729153186117404170L;
private Integer i;
private String s;
private Long l;
private List<Result> list;
private boolean b;
......
}
@WebService
public interface TestService {
Result method(Param p);
}
@Service
@WebService(endpointInterface = "org.alex.test.webservice.TestService")
public class TestServiceImpl implements TestService {
@Override
public Result method(Param p) {
Result r = new Result();
BeanUtils.copyProperties(p, r);
return r;
}
}
<!-- cxf -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="testCxfService" implementor="org.alex.test.webservice.TestServiceImpl" address="/cxf" />
<bean id="testServiceImpl" class="org.alex.test.webservice.TestServiceImpl" />
<!-- hessian -->
<bean name="/hes" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="testServiceImpl" />
<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
</bean>
<!-- spring http invoke -->
<bean name="/spr" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="testServiceImpl" />
<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
</bean>
客户端
public class Client {
static String CXF = "cxfService";
static String HESSIAN = "hesService";
static String SPRING = "sprService";
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("client.xml");
TestService service = (TestService) ac.getBean(SPRING);
Param p = new Param();
p.setI(100);
p.setB(true);
p.setL(1000L);
p.setS("123456789123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_\r\n\\\t");
p.getList().add(new Param());
p.getList().add(new Param());
p.getList().add(new Param());
service.method(p);
long now = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
service.method(p);
}
System.out.println(System.currentTimeMillis() - now);
}
}
public class MultiThreadClient {
static String CXF = "cxfService";
static String HESSIAN = "hesService";
static String SPRING = "sprService";
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("client.xml");
TestService service = (TestService) ac.getBean(HESSIAN);
Param p = new Param();
p.setI(100);
p.setB(true);
p.setL(1000L);
p.setS("123456789123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_\r\n\\\t");
p.getList().add(new Param());
p.getList().add(new Param());
p.getList().add(new Param());
service.method(p);
ExecutorService exe = Executors.newFixedThreadPool(10);
Task task = new Task(service, p);
long now = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
exe.submit(task);
}
exe.shutdown();
while (!exe.isTerminated()) {
}
System.out.println(System.currentTimeMillis() - now);
}
private static class Task implements Runnable {
TestService service;
Param p;
public Task(TestService service, Param p) {
this.service = service;
this.p = p;
}
@Override
public void run() {
service.method(p);
}
}
}
<jaxws:client id="cxfService" serviceClass="org.alex.test.webservice.TestService" address="http://localhost:8080/webservice/cxf/cxf?wsdl" />
<bean id="hesService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/webservice/app/hes" />
<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
</bean>
<bean id="sprService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/webservice/app/spr" />
<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
</bean>
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐