René's URL Explorer Experiment


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

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@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-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:57e51f70-5c01-0eff-08b5-59bcb40e51c9
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idC2EE:2A0782:20750C7:2C271BA:6A538F65
html-safe-noncea226444fa9709074bf1980472c4aab62c2a08a9ca317e1ae85f16d8defb9e7ab
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMkVFOjJBMDc4MjoyMDc1MEM3OjJDMjcxQkE6NkE1MzhGNjUiLCJ2aXNpdG9yX2lkIjoiMTA4Nzk2Njk3MjIxNjU3Nzg5MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacca8308aaf12590b1b1fd3f7594286095de2854b06ef9ebdb054637e906bde57e
hovercard-subject-tagissue:2548654678
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/msgpack/msgpack-java/841/issue_layout
twitter:imagehttps://opengraph.githubassets.com/ca87f8bc285e37027e12bbf71f9797cf89b1fd66d8836b2aafd408ccc9e26b6b/msgpack/msgpack-java/issues/841
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/ca87f8bc285e37027e12bbf71f9797cf89b1fd66d8836b2aafd408ccc9e26b6b/msgpack/msgpack-java/issues/841
og:image:altI 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:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernamejohn-boxcar
hostnamegithub.com
expected-hostnamegithub.com
Noneb9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb
turbo-cache-controlno-preview
go-importgithub.com/msgpack/msgpack-java git https://github.com/msgpack/msgpack-java.git
octolytics-dimension-user_id198264
octolytics-dimension-user_loginmsgpack
octolytics-dimension-repository_id1971346
octolytics-dimension-repository_nwomsgpack/msgpack-java
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1971346
octolytics-dimension-repository_network_root_nwomsgpack/msgpack-java
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release07a982c1d40157c619b364352b704c3ce66bb332
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/msgpack/msgpack-java/issues/841#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmsgpack%2Fmsgpack-java%2Fissues%2F841
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmsgpack%2Fmsgpack-java%2Fissues%2F841
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=msgpack%2Fmsgpack-java
Reloadhttps://github.com/msgpack/msgpack-java/issues/841
Reloadhttps://github.com/msgpack/msgpack-java/issues/841
Reloadhttps://github.com/msgpack/msgpack-java/issues/841
Please reload this pagehttps://github.com/msgpack/msgpack-java/issues/841
msgpack https://github.com/msgpack
msgpack-javahttps://github.com/msgpack/msgpack-java
Notifications https://github.com/login?return_to=%2Fmsgpack%2Fmsgpack-java
Fork 323 https://github.com/login?return_to=%2Fmsgpack%2Fmsgpack-java
Star 1.5k https://github.com/login?return_to=%2Fmsgpack%2Fmsgpack-java
Code https://github.com/msgpack/msgpack-java
Issues 60 https://github.com/msgpack/msgpack-java/issues
Pull requests 5 https://github.com/msgpack/msgpack-java/pulls
Actions https://github.com/msgpack/msgpack-java/actions
Projects https://github.com/msgpack/msgpack-java/projects
Wiki https://github.com/msgpack/msgpack-java/wiki
Security and quality 1 https://github.com/msgpack/msgpack-java/security
Insights https://github.com/msgpack/msgpack-java/pulse
Code https://github.com/msgpack/msgpack-java
Issues https://github.com/msgpack/msgpack-java/issues
Pull requests https://github.com/msgpack/msgpack-java/pulls
Actions https://github.com/msgpack/msgpack-java/actions
Projects https://github.com/msgpack/msgpack-java/projects
Wiki https://github.com/msgpack/msgpack-java/wiki
Security and quality https://github.com/msgpack/msgpack-java/security
Insights https://github.com/msgpack/msgpack-java/pulse
Why is MessagePack slower than JSON in jackson-databind?https://github.com/msgpack/msgpack-java/issues/841#top
https://github.com/komamitsu
https://github.com/john-boxcar
john-boxcarhttps://github.com/john-boxcar
on Sep 25, 2024https://github.com/msgpack/msgpack-java/issues/841#issue-2548654678
komamitsuhttps://github.com/komamitsu
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.