package org.neo4j.smack.performance; import java.util.Date; import javax.ws.rs.core.MediaType; import org.neo4j.smack.Smack; import org.neo4j.smack.test.util.FixedRequestClient; import org.neo4j.smack.test.util.PerformanceRoutes; import org.neo4j.test.ImpermanentGraphDatabase; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource.Builder; /** * This is meant as a source of feedback for experimenting * with improving network latency. * * High scores: * smack : 88.229 µs / req * jetty+jersey : 1 971.900 µs / req * * Suggested things to try: * - Look into adjusting TCP packet ACK rate from Java * - Go through full call path, ensure it is garbage free * - Look into optimizing the request router */ public class NetworkLatency { private Smack server; private FixedRequestClient pipelineClient; public static void main(String [] args) { NetworkLatency latency = new NetworkLatency(); System.out.println("Running over-the-network request latency tests.. (this may take a while)"); double avgLatency = latency.test(); System.out.println("Average over-the-network request latency: " + avgLatency + "ms"); } private double test() { try { int numRequests = 500000; //startServer(); pipelineClient = new FixedRequestClient("localhost", 7473, PerformanceRoutes.NO_SERIALIZATION_AND_NO_DESERIALIZATION_AND_NO_INTROSPECTION, 1); Date start = new Date(); sendXRequests("http://localhost:7473" + PerformanceRoutes.NO_SERIALIZATION_AND_NO_DESERIALIZATION_AND_NO_INTROSPECTION, numRequests); //sendXRequestsPipelined(numRequests); Date end = new Date(); long total = end.getTime() - start.getTime(); return ((double)total)/numRequests; } catch (Throwable e) { e.printStackTrace(); return 0d; } finally { //stopServer(); } } private void sendXRequests(String uri, int numRequests) { Builder resource = Client.create().resource(uri).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON); for(int i=0;i<numRequests;i++) { ClientResponse response = resource.get(ClientResponse.class); } } private void sendXRequestsPipelined(int numRequests) throws InterruptedException { for(int i=0;i<numRequests;i++) { pipelineClient.sendBatch(); pipelineClient.waitForXResponses(i); } } private void startServer() { server = new Smack("localhost", 7473, new ImpermanentGraphDatabase()); server.addRoute("",new PerformanceRoutes()); server.start(); } private void stopServer() { server.stop(); } }