Warum ist Spring MVC json Serialisierung 10x langsamer als Jackson manuell aufrufen?

8

Wenn Sie apachebench mit den Optionen "ab -k -c 50 -n 1000000" (50 gleichzeitige Threads) verwenden, wird eine 10-fache Leistungsdifferenz zwischen den folgenden beiden Methoden angezeigt (manuelle und federverwaltete Serialisierung). Ist es möglich, die gleiche Leistung über die Konfiguration der Spring-Serialisierung zu erreichen?

Ich führe den Test unter Windows 7, JDK8, i7-6700 durch. Eingebettete Tomcat , ähnliche Ergebnisse auch mit Undertow oder Jetty . Eine ähnliche WildFly 10 JAX-RS Beispiel-Apps-Leistung liefert ähnliche Ergebnisse wie die manuelle Spring-One, so sehe ich keinen Grund, warum Spring automatischen Modus so langsam sein sollte.

Vollständiger Quellcode:

%Vor%

Bearbeiten: Ablaufverfolgung der automatischen Serialisierung:

Trace der manuellen Serialisierung:

    
GeorgeStone 17.07.2016, 15:13
quelle

1 Antwort

3

Die einzige Idee, die ich habe, ist, dass Spring standardmäßig ObjectMapper ist ein bisschen anders konfiguriert als die, die Sie in Ihrem Benchmark verwenden. Wie in den Kommentaren erwähnt, würden Sie wahrscheinlich ein wenig Overhead sehen, wenn Sie Spring das Mapping automatisch überlassen, aber es sollte nicht mehr als ein paar Prozent Auswirkungen haben.

Um sicherzustellen, dass der Vergleich fair ist, fügen Sie diese Bean-Definition zu Ihrer Konfiguration hinzu:

%Vor%

und ersetzen Sie ObjectMapper mapper = new ObjectMapper(new JsonFactory()); durch ein automatisches Feld:

%Vor%

und sehen Sie, ob die Benchmarks den gleichen Wert zurückgeben.

BEARBEITEN

Ich wollte das für myselt verifizieren, also schrieb ich einen JMeter-Plan und führte jeden Endpunkt genau 5kk mal mit einer 1-minütigen Aufwärmphase aus. Die Ergebnisse waren wie erwartet, keine wesentlichen Unterschiede zwischen den Ansätzen:

%Vor%

Wichtig ist der Durchsatzunterschied - 15577.3 von Auto und 15660.2 von Manual.

Hier ist mein JMeter Testplan , wenn Sie es selbst testen möchten, lief ich auf Port 8081. Wenn ich die Zeit finde, werde ich ein anderes Benchmarking-Framework ausprobieren, vielleicht Gatling.

    
Miloš Milivojević 20.07.2016, 10:01
quelle