L'utilizzo di apachebench con le opzioni "ab -k -c 50 -n 1000000" (50 thread simultanei) mostra una differenza di prestazioni di 10 volte tra i seguenti 2 metodi (serializzazione manuale e gestita a molla). È possibile ottenere le stesse prestazioni tramite la configurazione della serializzazione Spring?Perché la serializzazione Spring MVC json è 10 volte più lenta rispetto alla chiamata manuale di jackson?
Sto eseguendo il test su Windows 7, JDK8, i7-6700. Incorporato Tomcat, risultati simili con Undertow o Jetty anche. Una simile WildFly 10 JAX-RS prestazioni di app di esempio produce risultati simili a quella manuale primaverile, quindi non vedo alcun motivo per cui la modalità automatica Spring dovrebbe essere così lenta.
il codice sorgente completo:
@SpringBootApplication
@Controller
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
ObjectMapper mapper = new ObjectMapper(new JsonFactory());
@RequestMapping(value = "/auto", produces = "application/json; charset=utf-8")
@ResponseBody
public Lol automaticSerialization() {
Lol lol = new Lol();
lol.a = UUID.randomUUID().toString();
lol.b = System.currentTimeMillis();
return lol;
}
@RequestMapping(value = "/manual", produces = "application/json; charset=utf-8")
@ResponseBody
public String manualSerialization() throws JsonProcessingException {
Lol lol = new Lol();
lol.a = UUID.randomUUID().toString();
lol.b = System.currentTimeMillis();
return mapper.writeValueAsString(lol);
}
public static class Lol {
String a;
long b;
public void setA(String a) {
this.a = a;
}
public void setB(long b) {
this.b = b;
}
public String getA() {
return a;
}
public long getB() {
return b;
}
}
}
Edit: Traccia di serializzazione automatica:
Traccia di serializzazione manuale:
L'unica differenza che vedo è l'esecuzione dei vari HttpMessageConverter per trovare il convertitore di jackson. Questo convertitore chiama 'ObjectMapper.canSerialize' e gestisce' @ JsonView' ma onestamente, non vedo perché queste chiamate possano aggiungere un overhead x10 –
È davvero strano. Ho allegato alcuni screenshot dei risultati di profilazione. – GeorgeStone
Hai provato le stesse chiamate ma hai restituito elenchi di 100 LOL?Mi chiedo se ci sia un po 'di ottimizzazione del lotto in gioco con tempi più lenti rispetto al semplice writeValueAsString – RutledgePaulV