Hi Sergey,

Wow! I tested your idea and it produced dramatically better results! The 
roundtrip time for 404 requests decreased by a factor of 10 (from 0.500 seconds 
down to 0.030 seconds). That is a huge success for our investigation, and I 
believe that our observation is really true that the overhead is spent in the 
error handling code. Just out of curiosity: with the same 
SimpleApplicationMapper:

public class SimpleApplicationExceptionMapper implements 
ExceptionMapper<WebApplicationException> {

        @Override
        public Response toResponse(WebApplicationException exception) {
                return Response.status(404).build();
        }

}

Jersey behaved very similarly to CXF in terms of roundtrip time.


However, without this class, Jersey performed even faster - most of the times 
were 10 times faster, i.e. around 0.003 seconds, while in the CXF case ... you 
already know it :) - 0.500 seconds


Thank a lot for your idea and suggestion! It definitely shed light on where the 
discrepancies come from.


Kindest Regards,
Krum.

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]] 
Sent: Friday, February 17, 2012 6:14 PM
To: [email protected]
Subject: Re: REST performance discrepancies between CXF and Jersey

Hi Krum,
On 17/02/12 15:26, Bakalsky, Krum wrote:
> Hi to all Apache CXF users!,
>
> I would kindly like to bring to your attention a particular problem that we 
> are currently being stuck into. We are experimenting with a simple web 
> application, which exposes its functionality via REST. We are using 
> JAX-RS/JSON, no SOAP, no JAX-WS. We deploy our application on top of Tomcat 
> 7, and test both against CXF 2.5.2 and Jersey as REST frameworks.
>
> For calculating our performance measurements, we simply execute REST 
> requests, and in the client we measure the time that the roundtrip takes. 
> Apart from that, on the server side, we measure as well the time that our 
> REST resource consumes, i.e. the method call time. In summary, we have some 
> huge differences between CXF and Jersey - in favor of Jersey being much 
> faster - in the cases where we test against non-existing resources. In all 
> other cases, the numbers we got were really very close for the two REST 
> frameworks.
>
> But when testing against non-existing REST paths, the roundtrip time in CXF 
> case is approximately 0.5 seconds, while in the case of Jersey it is 0.01 
> seconds. We think that this is quite strange, and probably we are not using 
> CXF in its proper configuration. Could you please give us some hints ? Maybe 
> we have to tune and tweak it a little bit, so that we get the best out of it.
>
> The server side time, in the case of CXF, is rather small - 0.001 seconds, so 
> we wonder where is that half second spent in ? In our application logic, in 
> the case when the path is not correct, we throw 
> javax.ws.rs.WebApplicationException and with a debugger we saw that this 
> exception is getting caught in CXF, and heavily processed further down the 
> stack.
>
> Are you aware of such kind of issues, with CXF handling the 404 situation in 
> a very heavyweight manner ? Maybe it does some thorough processing to try to 
> map the URI to some existing REST resource, I don't know ... maybe 
> performance here could depend on the particular JSON framework that is being 
> used. ...
>

I suspect it could be the default WebApplicationExceptionMapper which is 
to blame.
In CXF, a given Exception, once wrapped in a Response, is treated like 
any other regular response, but I'm not sure it would explain the 
difference.

Can you give me a favor please and register a custom 
WebApplicationException mapper which would only return:

Response.status(exception.getStatus()).build() ?

Have a look please at the default mapper's code:
http://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java

As you can see, we are trying to go to some length there to figure out 
what and how to report a given exception and I reckon it all adds up to 
the response time.

Please try eliminating the default mapper and let us know the results

Thanks, Sergey

>
> Kindest Regards,
> Krum.
>
>

Reply via email to