Title: Why is MessagePack slower than JSON in jackson-databind? · Issue #841 · msgpack/msgpack-java · GitHub
Open Graph Title: Why is MessagePack slower than JSON in jackson-databind? · Issue #841 · msgpack/msgpack-java
X Title: Why is MessagePack slower than JSON in jackson-databind? · Issue #841 · msgpack/msgpack-java
Description: I wrote this crude benchmark to compare the performance of JSON and MessagePack. Consistently, JSON is faster during serialization, faster on deserialization, and MessagePack produces smaller payloads. Based on what I've read, I was expe...
Open Graph Description: I wrote this crude benchmark to compare the performance of JSON and MessagePack. Consistently, JSON is faster during serialization, faster on deserialization, and MessagePack produces smaller paylo...
X Description: I wrote this crude benchmark to compare the performance of JSON and MessagePack. Consistently, JSON is faster during serialization, faster on deserialization, and MessagePack produces smaller paylo...
Opengraph URL: https://github.com/msgpack/msgpack-java/issues/841
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Why is MessagePack slower than JSON in jackson-databind?","articleBody":"I wrote this crude benchmark to compare the performance of JSON and MessagePack. Consistently, JSON is faster during serialization, faster on deserialization, and MessagePack produces smaller payloads. Based on what I've read, I was expecting MessagePack to be faster during both serialization and deserialization in addition to producing smaller payloads. Are my expecations unrealistic or is there room for improvement here? On my machine, I'm getting this output:\r\n```\r\n==================================== OUTPUT ====================================\r\nJSON serialized 1,000,000 times in 893ms\r\nJSON size 360\r\nMessagePack serialized 1,000,000 times in 1497ms\r\nMessagePack size 304\r\nJSON deserialized 1,000,000 times in 1496ms\r\nMessagePack deserialized 1,000,000 times in 1777ms\r\n\r\n=================================== SUMMARY ====================================\r\nJSON serialization is %40.35 faster than MessagePack serialization\r\nJSON deserialization is %15.81 faster than MessagePack deserialization\r\nMessagePack is %15.56 smaller than JSON\r\n```\r\n\r\nHere are my dependency versions:\r\n```\r\n+- org.msgpack:jackson-dataformat-msgpack:jar:0.9.8:compile\r\n| | +- com.google.http-client:google-http-client-jackson2:jar:1.44.1:compile\r\n+- com.fasterxml.jackson.core:jackson-databind:jar:2.17.1:compile\r\n| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.17.1:compile\r\n| \\- com.fasterxml.jackson.core:jackson-core:jar:2.17.1:compile\r\n+- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.17.1:compile\r\n+- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.17.1:compile\r\n| +- org.msgpack:jackson-dataformat-msgpack:jar:0.9.8:compile\r\n| | | +- com.google.http-client:google-http-client-jackson2:jar:1.44.1:compile\r\n| +- com.fasterxml.jackson.core:jackson-databind:jar:2.17.1:compile\r\n| | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.17.1:compile\r\n| | \\- com.fasterxml.jackson.core:jackson-core:jar:2.17.1:compile\r\n| +- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.17.1:compile\r\n| +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.17.1:compile\r\n```\r\n\r\nHere is the code:\r\n```java\r\nimport com.fasterxml.jackson.annotation.JsonProperty;\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport org.msgpack.jackson.dataformat.MessagePackMapper;\r\n\r\nimport java.io.IOException;\r\nimport java.text.NumberFormat;\r\nimport java.util.List;\r\nimport java.util.Locale;\r\n\r\npublic class MessagePackMain {\r\n private static final String SAMPLE_JSON = \"\"\"\r\n {\r\n \"glossary\": {\r\n \"title\": \"example glossary\",\r\n \"GlossDiv\": {\r\n \"title\": \"S\",\r\n \"GlossList\": {\r\n \"GlossEntry\": {\r\n \"ID\": \"SGML\",\r\n \"SortAs\": \"SGML\",\r\n \"GlossTerm\": \"Standard Generalized Markup Language\",\r\n \"Acronym\": \"SGML\",\r\n \"Abbrev\": \"ISO 8879:1986\",\r\n \"GlossDef\": {\r\n \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\r\n \"GlossSeeAlso\": [\"GML\", \"XML\"]\r\n },\r\n \"GlossSee\": \"markup\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \"\"\";\r\n\r\n public static void main(String[] args) throws IOException {\r\n ObjectMapper jsonMapper = new ObjectMapper();\r\n ObjectMapper messagePackMapper = new MessagePackMapper();\r\n int iterations = 1_000_000;\r\n\r\n Item item = new ObjectMapper().readValue(SAMPLE_JSON, Item.class);\r\n\r\n System.out.println(\"==================================== OUTPUT ====================================\");\r\n\r\n long startTime = System.currentTimeMillis();\r\n byte[] jsonOutput = null;\r\n byte[] messagePackOutput = null;\r\n\r\n for (int i =0; i \u003c iterations; i++) {\r\n byte[] bytes = jsonMapper.writeValueAsBytes(item);\r\n if (jsonOutput == null) {\r\n jsonOutput = bytes;\r\n }\r\n }\r\n\r\n long endTime = System.currentTimeMillis();\r\n long jSerializeElapsedTime = endTime - startTime;\r\n System.out.println(\"JSON serialized \" + NumberFormat.getNumberInstance(Locale.US).format(iterations) + \" times in \" + jSerializeElapsedTime + \"ms\");\r\n System.out.println(\"JSON size \" + jsonOutput.length);\r\n\r\n startTime = System.currentTimeMillis();\r\n\r\n for (int i =0; i \u003c iterations; i++) {\r\n byte[] bytes = messagePackMapper.writeValueAsBytes(item);\r\n if (messagePackOutput == null) {\r\n messagePackOutput = bytes;\r\n }\r\n }\r\n\r\n endTime = System.currentTimeMillis();\r\n long mSerializeElapsedTime = endTime - startTime;\r\n System.out.println(\"MessagePack serialized \" + NumberFormat.getNumberInstance(Locale.US).format(iterations) + \" times in \" + mSerializeElapsedTime + \"ms\");\r\n System.out.println(\"MessagePack size \" + messagePackOutput.length);\r\n\r\n String newJson = new String(jsonOutput);\r\n startTime = System.currentTimeMillis();\r\n\r\n for (int i =0; i \u003c iterations; i++) {\r\n jsonMapper.readValue(newJson, Item.class);\r\n }\r\n\r\n endTime = System.currentTimeMillis();\r\n long jDeserializeElapsedTime = endTime - startTime;\r\n System.out.println(\"JSON deserialized \" + NumberFormat.getNumberInstance(Locale.US).format(iterations) + \" times in \" + jDeserializeElapsedTime + \"ms\");\r\n\r\n startTime = System.currentTimeMillis();\r\n\r\n for (int i =0; i \u003c iterations; i++) {\r\n messagePackMapper.readValue(messagePackOutput, Item.class);\r\n }\r\n\r\n endTime = System.currentTimeMillis();\r\n long mDeserializeElapsedTime = endTime - startTime;\r\n System.out.println(\"MessagePack deserialized \" + NumberFormat.getNumberInstance(Locale.US).format(iterations) + \" times in \" + mDeserializeElapsedTime + \"ms\");\r\n\r\n System.out.println(\"\\n=================================== SUMMARY ====================================\");\r\n\r\n if (jSerializeElapsedTime \u003e mSerializeElapsedTime) {\r\n System.out.printf(\"MessagePack serialization is %%%.02f faster than JSON serialization\\n\", ((1.0 - (float) mSerializeElapsedTime / (float) jSerializeElapsedTime))*100.0);\r\n } else {\r\n System.out.printf(\"JSON serialization is %%%.02f faster than MessagePack serialization\\n\", ((1.0 - (float) jSerializeElapsedTime / (float) mSerializeElapsedTime))*100.0);\r\n }\r\n\r\n if (jDeserializeElapsedTime \u003e mDeserializeElapsedTime) {\r\n System.out.printf(\"MessagePack deserialization is %%%.02f faster than JSON deserialization\\n\", ((1.0 - (float) mDeserializeElapsedTime / (float) jDeserializeElapsedTime))*100.0);\r\n } else {\r\n System.out.printf(\"JSON deserialization is %%%.02f faster than MessagePack deserialization\\n\", ((1.0 - (float) jDeserializeElapsedTime / (float) mDeserializeElapsedTime))*100.0);\r\n }\r\n\r\n if (jsonOutput.length \u003e messagePackOutput.length) {\r\n System.out.printf(\"MessagePack is %%%.02f smaller than JSON\\n\", ((1.0 - (float) messagePackOutput.length / (float)jsonOutput.length))*100.0);\r\n } else {\r\n System.out.printf(\"JSON is %%%.02f smaller than MessagePack\\n\", ((1.0 - (float) jsonOutput.length / (float)messagePackOutput.length))*100.0);\r\n }\r\n }\r\n\r\n private static class Item {\r\n private Glossary glossary;\r\n\r\n public Glossary getGlossary() {\r\n return glossary;\r\n }\r\n\r\n public void setGlossary(Glossary glossary) {\r\n this.glossary = glossary;\r\n }\r\n }\r\n \r\n private static class GlossaryDef {\r\n private String para;\r\n \r\n @JsonProperty(\"GlossSeeAlso\")\r\n private List\u003cString\u003e seeAlso;\r\n\r\n public String getPara() {\r\n return para;\r\n }\r\n\r\n public void setPara(String para) {\r\n this.para = para;\r\n }\r\n\r\n public List\u003cString\u003e getSeeAlso() {\r\n return seeAlso;\r\n }\r\n\r\n public void setSeeAlso(List\u003cString\u003e seeAlso) {\r\n this.seeAlso = seeAlso;\r\n }\r\n }\r\n \r\n private static class GlossaryEntry {\r\n @JsonProperty(\"ID\")\r\n private String id;\r\n \r\n @JsonProperty(\"SortAs\")\r\n private String sortAs;\r\n \r\n @JsonProperty(\"GlossTerm\")\r\n private String glossTerm;\r\n \r\n @JsonProperty(\"Acronym\")\r\n private String acronym;\r\n \r\n @JsonProperty(\"Abbrev\")\r\n private String abbrev;\r\n \r\n @JsonProperty(\"GlossDef\")\r\n private GlossaryDef glossaryDef;\r\n \r\n @JsonProperty(\"GlossSee\")\r\n private String glossSee;\r\n\r\n public String getId() {\r\n return id;\r\n }\r\n\r\n public void setId(String id) {\r\n this.id = id;\r\n }\r\n\r\n public String getSortAs() {\r\n return sortAs;\r\n }\r\n\r\n public void setSortAs(String sortAs) {\r\n this.sortAs = sortAs;\r\n }\r\n\r\n public String getGlossTerm() {\r\n return glossTerm;\r\n }\r\n\r\n public void setGlossTerm(String glossTerm) {\r\n this.glossTerm = glossTerm;\r\n }\r\n\r\n public String getAcronym() {\r\n return acronym;\r\n }\r\n\r\n public void setAcronym(String acronym) {\r\n this.acronym = acronym;\r\n }\r\n\r\n public String getAbbrev() {\r\n return abbrev;\r\n }\r\n\r\n public void setAbbrev(String abbrev) {\r\n this.abbrev = abbrev;\r\n }\r\n\r\n public GlossaryDef getGlossaryDef() {\r\n return glossaryDef;\r\n }\r\n\r\n public void setGlossaryDef(GlossaryDef glossaryDef) {\r\n this.glossaryDef = glossaryDef;\r\n }\r\n\r\n public String getGlossSee() {\r\n return glossSee;\r\n }\r\n\r\n public void setGlossSee(String glossSee) {\r\n this.glossSee = glossSee;\r\n }\r\n }\r\n \r\n private static class GlossaryList {\r\n @JsonProperty(\"GlossEntry\")\r\n private GlossaryEntry glossaryEntry;\r\n\r\n public GlossaryEntry getGlossaryEntry() {\r\n return glossaryEntry;\r\n }\r\n\r\n public void setGlossaryEntry(GlossaryEntry glossaryEntry) {\r\n this.glossaryEntry = glossaryEntry;\r\n }\r\n }\r\n \r\n private static class GlossaryDiv {\r\n private String title;\r\n \r\n @JsonProperty(\"GlossList\")\r\n private GlossaryList glossaryList;\r\n\r\n public String getTitle() {\r\n return title;\r\n }\r\n\r\n public void setTitle(String title) {\r\n this.title = title;\r\n }\r\n\r\n public GlossaryList getGlossaryList() {\r\n return glossaryList;\r\n }\r\n\r\n public void setGlossaryList(GlossaryList glossaryList) {\r\n this.glossaryList = glossaryList;\r\n }\r\n }\r\n \r\n private static class Glossary {\r\n private String title;\r\n \r\n @JsonProperty(\"GlossDiv\")\r\n private GlossaryDiv glossaryDiv;\r\n\r\n public String getTitle() {\r\n return title;\r\n }\r\n\r\n public void setTitle(String title) {\r\n this.title = title;\r\n }\r\n\r\n public GlossaryDiv getGlossaryDiv() {\r\n return glossaryDiv;\r\n }\r\n\r\n public void setGlossaryDiv(GlossaryDiv glossaryDiv) {\r\n this.glossaryDiv = glossaryDiv;\r\n }\r\n }\r\n}\r\n```","author":{"url":"https://github.com/john-boxcar","@type":"Person","name":"john-boxcar"},"datePublished":"2024-09-25T18:01:19.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":8},"url":"https://github.com/841/msgpack-java/issues/841"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:57e51f70-5c01-0eff-08b5-59bcb40e51c9 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C2EE:2A0782:20750C7:2C271BA:6A538F65 |
| html-safe-nonce | a226444fa9709074bf1980472c4aab62c2a08a9ca317e1ae85f16d8defb9e7ab |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMkVFOjJBMDc4MjoyMDc1MEM3OjJDMjcxQkE6NkE1MzhGNjUiLCJ2aXNpdG9yX2lkIjoiMTA4Nzk2Njk3MjIxNjU3Nzg5MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ca8308aaf12590b1b1fd3f7594286095de2854b06ef9ebdb054637e906bde57e |
| hovercard-subject-tag | issue:2548654678 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/msgpack/msgpack-java/841/issue_layout |
| twitter:image | https://opengraph.githubassets.com/ca87f8bc285e37027e12bbf71f9797cf89b1fd66d8836b2aafd408ccc9e26b6b/msgpack/msgpack-java/issues/841 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/ca87f8bc285e37027e12bbf71f9797cf89b1fd66d8836b2aafd408ccc9e26b6b/msgpack/msgpack-java/issues/841 |
| og:image:alt | I wrote this crude benchmark to compare the performance of JSON and MessagePack. Consistently, JSON is faster during serialization, faster on deserialization, and MessagePack produces smaller paylo... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | john-boxcar |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/msgpack/msgpack-java git https://github.com/msgpack/msgpack-java.git |
| octolytics-dimension-user_id | 198264 |
| octolytics-dimension-user_login | msgpack |
| octolytics-dimension-repository_id | 1971346 |
| octolytics-dimension-repository_nwo | msgpack/msgpack-java |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1971346 |
| octolytics-dimension-repository_network_root_nwo | msgpack/msgpack-java |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width