{"id":19372953,"url":"https://github.com/android-notes/mmap-benchmark","last_synced_at":"2025-06-29T13:03:00.600Z","repository":{"id":117942306,"uuid":"275196563","full_name":"android-notes/mmap-benchmark","owner":"android-notes","description":"mmap/read performance","archived":false,"fork":false,"pushed_at":"2020-06-26T16:17:50.000Z","size":346,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-24T14:55:23.664Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/android-notes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-26T16:09:10.000Z","updated_at":"2020-12-24T12:39:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"66ffe444-b51b-459b-901e-8c5d8e8a005d","html_url":"https://github.com/android-notes/mmap-benchmark","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/android-notes/mmap-benchmark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/android-notes%2Fmmap-benchmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/android-notes%2Fmmap-benchmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/android-notes%2Fmmap-benchmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/android-notes%2Fmmap-benchmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/android-notes","download_url":"https://codeload.github.com/android-notes/mmap-benchmark/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/android-notes%2Fmmap-benchmark/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262598139,"owners_count":23334667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T08:25:56.018Z","updated_at":"2025-06-29T13:03:00.563Z","avatar_url":"https://github.com/android-notes.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## mmap/read 性能测试\n测试机型：小米1\n\nCPU：双核1.5G\n\n内存：1GB\n\n可用内存大小：\u003c400M\n\n系统版本：Android 4.1.2   MIUI-4.12.5\n\n内核版本：3.4.0\n\n剩余内置存储容量：\u003e2GB\n\n### 测试方式\n由于mmap和read都会优先从pagecache（内存）里读写数据，所以我们每次测试读取速度前会先重启手机一次。\n为了避免手机刚重启时大量的APP启动导致的文件读写性能下降，我们会在手机重启一分钟后开始读取数据。\n我们采用顺序读写整个文件而不是随机读写。\n\n![流程图](https://github.com/android-notes/mmap-benchmark/blob/master/%E6%B5%81%E7%A8%8B%E5%9B%BE.png)\n\n### 数据分析\n\n#### 第一组数据\n生成新文件    数量：800, 总大小：1.97MB\n\n·------------------------------------------------------------------------\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:941.7132ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:246.87985ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:212.8877ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:217.43808ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:218.7489ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:279.9566ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:248.11171ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:262.9701ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:199.49629ms\n\nJavaBuffRead:  文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:222.94623ms\n\n·------------------------------------------------------------------------\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:822.48267ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:144.88919ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:145.90964ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:145.51067ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:145.27896ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:148.18845ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:162.05777ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:150.64282ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:146.28073ms\n\nJavaMMap:      文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:373.04608ms\n\n·------------------------------------------------------------------------\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:605.766000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:46.655000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:43.007000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.778000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:34.577000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.830000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:34.414000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:52.481000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.598000ms\n\nC++MMap:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:34.114000ms\n\n·------------------------------------------------------------------------\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:559.669000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:34.191000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.094000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.579000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.302000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:34.682000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.357000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:32.990000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.351000ms\n\nC++Read:       文件数量:800, 总大小:2070863, 文件大小:1.00KB ~ 4.00KB, 时间:33.342000ms\n\n\n我们生成了800个文件，每个文件在1.00KB ~ 4.00KB之间，然后重启手机，使用JavaBuffRead读取所有文件，重复读取10次。\n接着重启手机，使用JavaMMap读取所有文件，重复读取10次。C++MMap、C++Read处理方式类似。\n\n可以看到重启手机后第一次读取时不管使用什么读都很慢，但第二到第十次读取时会快很多。原因很简单，重启手机后pagecache里没有\n缓存这些文件，所以第一次读取很慢，当第一次读取后这些文件会缓存在pagecache里，所以之后读取快很多。\n\n可以看到在读取800个1.00KB ~ 4.00KB的文件时JavaBuffRead性能始终不如JavaMMap，而C++MMap和C++Read性能差不多。但C++优于Java\n\n#### 第二组数据：\n\n由于Java MMap没有释放内存，当重复读取时会导致oom，所以下面的数据没有测试JavaMMap\n\n生成新文件    数量：7, 总大小：443MB\n\n·------------------------------------------------------------------------\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13196.812ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12936.321ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12845.117ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12745.423ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12764.272ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12753.567ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12775.691ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12835.54ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12789.5625ms\n\nJavaBuffRead:  文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12921.611ms\n\n·------------------------------------------------------------------------\n\n·------------------------------------------------------------------------\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13096.722000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13112.188000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13472.156000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13267.084000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13384.470000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13313.636000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13240.341000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13473.497000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13185.855000ms\n\nC++MMap:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13035.580000ms\n\n·------------------------------------------------------------------------\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:13303.030000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12772.999000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12616.530000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12579.744000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12501.277000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12485.761000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12538.512000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12490.923000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12523.119000ms\n\nC++Read:       文件数量:7, 总大小:464923544, 文件大小:42.63MB ~ 93.76MB, 时间:12768.424000ms\n\n\n当文件总大小400多MB时第一次和第二到第十次性能差不多。由于手机可用内存不到400MB，所以读取400多MB文件时pagecache里\n肯定放不下了，所以第二次读取时依旧是从硬盘里读取，所以性能和第一次差不多。\n上面数据中C++MMap竟然是最慢的还不如JavaBuffRead\n\n### 完整数据\n[mmap-read性能数据.txt](https://github.com/android-notes/mmap-benchmark/blob/master/mmap-read%E6%80%A7%E8%83%BD%E6%95%B0%E6%8D%AE.txt)\n\n#### 备注：\n所有数据仅限于该款机型，不代表所有机型。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandroid-notes%2Fmmap-benchmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandroid-notes%2Fmmap-benchmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandroid-notes%2Fmmap-benchmark/lists"}