Slide 1

Slide 1 text

High-performance Jackson ौ୩Java #17 2016-10-01 KOMIYA Atsushi (@komiya_atsushi)

Slide 2

Slide 2 text

KOMIYA Atsushi @komiya_atsushi

Slide 3

Slide 3 text

Today’s topic

Slide 4

Slide 4 text

Jackson

Slide 5

Slide 5 text

= JSON parser / generator Ͱ͸ͳ͍ (ݫີʹ͸)

Slide 6

Slide 6 text

“Jackson is a suite of data- processing tools for Java” https://github.com/FasterXML/jackson/blob/master/README.md

Slide 7

Slide 7 text

JSON parer / generator
 ʰ΋ʱඪ४αϙʔτ͍ͯ͠Δ σʔλॲཧϥΠϒϥϦ

Slide 8

Slide 8 text

Jackson • JSON processor • Streaming API • Data binding (POJO to and from JSON) • Other formats • XML, YAML • Avro, CBOR, CSV, Smile, Protobuf

Slide 9

Slide 9 text

Popular JSON Libraries • 4,180 usages: Jackson Databind • 2,820 usages: Gson • 1,238 usages: Json (org.json) • 516 usages: JSON.simple • 494 usages: Jersey Json ※mvnrepository.com ௐ΂ɺ2016-10-01 ࣌఺

Slide 10

Slide 10 text

Jackson as JSON processor • Pros • γϦΞϥΠζɾσγϦΞϥΠζͱ΋ʹ଎͍ • ࠷଎Ͱ͸ͳͦ͞͏͚ͩͲ… • ػೳ͕๛෋Ͱɺᙱ͍ͱ͜Ζʹख͕ಧ͖΍͍͢ • ৼΔ෣͍ͷΧελϚΠζ͸·͋·͋͠΍͍͢ • ͍͍ҙຯͰރΕ͍ͯΔ ※ݸਓͷײ૝Ͱ͋Γɺੑೳɾੑ࣭Λอূ͢Δ΋ͷͰ͸͋Γ·ͤΜ

Slide 11

Slide 11 text

Jackson as JSON processor • Cons • ମܥతʹهड़͞Εͨྑ࣭ͳ೔ຊޠυΩϡϝϯτ͸ͳ͍ • ػೳ͕๛෋ա͗Δ͕Ώ͑ʹɺ࢖͍͜ͳ͢ͷ͸೉͍͠ • ʮ͜͏͍͏͜ͱ͸Ͱ͖Δͷ͔ͳʁʯ
 ʮͲ͏΍ͬͯઃఆ͢Ε͹͍͍Μͩʁʯ • ࣮૷͸៉ྷ͚ͩͲɺΫϥε਺͕ଟͯ͘ॳݟࡴ͠ײ͕͋ Δ ※ݸਓͷײ૝Ͱ͋Γɺੑೳɾੑ࣭Λอূ͢Δ΋ͷͰ͸͋Γ·ͤΜ

Slide 12

Slide 12 text

High-performance Jackson

Slide 13

Slide 13 text

(JSON prosessor ͱͯ͠͸ ࠷଎Ͱ͸ͳ͍͔΋͠Εͳ͍͕)
 Jackson Λ࠷଎ʹར༻͍ͨ͠❗

Slide 14

Slide 14 text

Shortest path to high-performance • Presentation: Jackson Performance • https://github.com/FasterXML/jackson-docs/ wiki/Presentation:-Jackson-Performance • Jackson Best Practices: Performance • http://wiki.fasterxml.com/ JacksonBestPracticesPerformance

Slide 15

Slide 15 text

ৄ͘͠͸ͪ͜ΒΛ͝ࢀরԼ͍͞ http://qiita.com/komiya_atsushi/items/803f69b51426ed476a75

Slide 16

Slide 16 text

ϕετϓϥΫςΟεʹै͏͜ͱͰ ͲΕ͘Β͍଎͘ͳΔͷ͔ʁ

Slide 17

Slide 17 text

ࠓճର৅ͱ͍ͯ͠ΔλεΫ • 1 ߦ͝ͱʹ JSON ͕ه࿥͞ΕͨϑΝΠϧ
 (= Line delimited JSON) ͕༩͑ΒΕ͍ͯΔ • JSON 1 ݅͝ͱʹಛఆͷॲཧΛ͍ͨ͠ • 㱺 JSON ͷσγϦΞϥΠζΛ࠷଎ʹ❗

Slide 18

Slide 18 text

۩ମతͳαϯϓϧλεΫ • Twitter Streaming API Ͱ 1,000 ݅ͷ tweet Λऩूͯ͠ɺ̍ͭ ͷϑΝΠϧʹ·ͱΊ͓ͯ͘ ǖ DVSMHFUIUUQTTUSFBNUXJUUFSDPNTUBUVTFTTBNQMFKTPOǘ • શ෦Ͱ໿ 4MB = JSON 1 ͭ͋ͨΓ 4KB ͙Β͍ • ্هϑΝΠϧΛಡΈࠐΈɺ೔ຊޠ tweet ͷ݅਺Λ਺্͑͛Δ • ೔ຊޠ͔൱͔͸ “lang” ଐੑͷ஋Ͱ൑ఆ͢Δ • ͜ͷλεΫͷεϧʔϓοτ (ops/s) Λ JMH Ͱଌఆ͢Δ

Slide 19

Slide 19 text

Baseline implementation • Best practice ʹࢥ͍͖ͬΓ൓͢Δɺ͋͑ͯ
 ඇޮ཰ͳ࣮૷͔Β࢝ΊΔ • ϑΝΠϧ͔Β 1 ߦͣͭจࣈྻͱͯ͠ಡΈࠐΉ • Data-binding Ͱ JSON → POJO ʹσγϦΞϥ Πζ͢Δ • ͜ͷॲཧͷ౎౓ɺObjectMapper Λੜ੒͢Δ

Slide 20

Slide 20 text

Baseline implementation 2.596 ops/s ͜Ε͕࠷΋ඇޮ཰

Slide 21

Slide 21 text

1. ObjectMapper Λ࠶ར༻͢Δ • POJO from JSON ͷ data-binding Λ͢Δͷʹ ຖճੜ੒͍ͯͨ͠ ObjectMapper Λ࢖͍·Θ͢ • ObjectMapper ͷΦϒδΣΫτੜ੒͸ಛʹॏ ͍ॲཧ • ObjectMapper ͸εϨουηʔϑ ☺

Slide 22

Slide 22 text

1. ObjectMapper Λ࠶ར༻͢Δ 32.533 ops/s (12.53x)

Slide 23

Slide 23 text

2. ObjectReader Λར༻͢Δ • ObjectMapper ͷ୅ΘΓʹ ObjectReader Λ ࢖͏ • ObjectMapper Λ࢖͏ΑΓͪΐͬͱ͚ͩ
 ޮ཰͕͍͍

Slide 24

Slide 24 text

2. ObjectReader Λར༻͢Δ 33.306 ops/s (1.024x)

Slide 25

Slide 25 text

3. ObjectReader
 #readValues(InputStream) • 1 ߦͣͭจࣈྻͱͯ͠ಡΈࠐΉͷΛ΍Ίɺ InputStream ͷ··Ͱ Jackson ʹ༩͑Δ • Jackson ͸ byte[] ΍ InputSteam ͳͲͷ
 ೖྗιʔεʹରͯ͠࠷దԽ͍ͯ͠Δ • String ͷೖྗιʔεʹ͸ͦΜͳʹ࠷దԽ͍ͯ͠ ΔΘ͚Ͱ͸ͳ͍

Slide 26

Slide 26 text

ࢀߟهࣄ (InfoQ) https://www.infoq.com/jp/news/2014/05/jackson-founder-responds

Slide 27

Slide 27 text

ࢀߟهࣄ (InfoQ) https://www.infoq.com/jp/news/2014/05/jackson-founder-responds “Jackson͕RESTͷج൫Ͱ͋Δ όΠτετϦʔϜɼ͋Δ͍͸ ϑΝΠϧετϨʔδΛపఈత ʹ࠷దԽ͍ͯ͠Δ”

Slide 28

Slide 28 text

3. ObjectReader
 #readValues(InputStream) 43.641 ops/s (1.310x)

Slide 29

Slide 29 text

(ิ଍) ObjectMaper → JsonFactory → JsonParser ͱ͍͏ํ๏΋͋Δ

Slide 30

Slide 30 text

4. Afterburner ϞδϡʔϧΛ࢖͏ • POJO to and from JSON ͷ data-binding Λߴ଎Խ͢ ΔϞδϡʔϧ • POJO ͷੜ੒΍ getter / setter ͷݺͼग़͠Λɺ
 ϦϑϨΫγϣϯͳ͠ʹόΠτίʔυੜ੒ͨ͠΋ͷͰ ࣮ݱ͢Δ • primitive ͳ஋ͷ boxing ΋ආ͚Δ͜ͱ͕Ͱ͖Δ • طଘͷίʔυ͸΄ͱΜͲมߋෆཁͰಋೖָ͕

Slide 31

Slide 31 text

4. Afterburner ϞδϡʔϧΛ࢖͏ 49.764 ops/s (1.140x) ͜ΕΛ௥ه

Slide 32

Slide 32 text

5. Streaming API Λར༻͢Δ • POJO to and from JSON ͸ɺͲ͏଍ૡ͍ͯ΋ॏ͍ ॲཧͰ͋Δ͜ͱʹ͸มΘΒͳ͍ • POJO ͷΦϒδΣΫτ͸ੜ੒͠ͳ͘ͱ΋ɺ Streaming API Λ࢖͑͹ JSON ͸ύʔεͰ͖Δ • Streaming API Ͱ໨తͷॲཧΛ࣮૷͢Δͷ͸େม ͕ͩɺ଎౓໘ʹ͓͍ͯ͸Ұ൪ޮՌత❗

Slide 33

Slide 33 text

5. Streaming API Λར༻͢Δ 77.969 ops/s (1.567x) ͜ͷ࣮૷ΛؤுΔ

Slide 34

Slide 34 text

Benchmark & result

Slide 35

Slide 35 text

Benchmark app https://github.com/komiya-atsushi/
 java-playground/tree/master/jackson-performance

Slide 36

Slide 36 text

Result: table 4DPSF #BTFMJOF 3FVTF0CKFDU.BQQFS 6TF0CKFDU3FBEFS 0CKFDU3FBEFSSFBE7BMVFT "GUFSCVSOFS 4USFBNJOH"1*

Slide 37

Slide 37 text

Result: chart 2x~ faster !

Slide 38

Slide 38 text

Conclusion

Slide 39

Slide 39 text

Conclusion • Jackson Ͱ POJO to and from JSON ͷγϦΞϥΠζɾσγϦΞ ϥΠζΛߴ଎ʹॲཧ͍ͨ͠ͷͰ͋Ε͹: • Jackson ͷΦϒδΣΫτ (ObjectMapper, ObjectReader ͳͲ) ͸ੵۃతʹ࠶ར༻͠Α͏ • ͳΔ΂͘ InputStream ΦϒδΣΫτΛ Jackson ʹ༩͑ΔΑ͏ ʹ͠Α͏ • Afterburner ΋࢖͏͜ͱΛݕ౼͠Α͏ • ΋ͬͱ଎౓ΛՔ͍͗ͨͷͰ͋Ε͹ɺStreaming API Λར༻͠Α͏

Slide 40

Slide 40 text

Thank you !