{"id":21486917,"url":"https://github.com/ntsd/go-mutex-comparison","last_synced_at":"2025-03-17T10:14:03.919Z","repository":{"id":213542177,"uuid":"734272639","full_name":"ntsd/go-mutex-comparison","owner":"ntsd","description":"Mutex vs RWMutex vs sync.Map, Concurrency map benchmark in different concurrent scenarios.","archived":false,"fork":false,"pushed_at":"2024-07-21T06:04:59.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-23T19:43:16.285Z","etag":null,"topics":["concurrency","concurrent-map","go","golang","map","thread","thread-safe"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ntsd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2023-12-21T09:25:03.000Z","updated_at":"2024-09-13T04:50:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"00ef76be-26df-44b2-b6c3-97991563c0c4","html_url":"https://github.com/ntsd/go-mutex-comparison","commit_stats":null,"previous_names":["ntsd/go-mutex-comparison"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntsd%2Fgo-mutex-comparison","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntsd%2Fgo-mutex-comparison/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntsd%2Fgo-mutex-comparison/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntsd%2Fgo-mutex-comparison/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ntsd","download_url":"https://codeload.github.com/ntsd/go-mutex-comparison/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244014186,"owners_count":20383716,"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":["concurrency","concurrent-map","go","golang","map","thread","thread-safe"],"created_at":"2024-11-23T13:24:47.640Z","updated_at":"2025-03-17T10:14:03.218Z","avatar_url":"https://github.com/ntsd.png","language":"Go","readme":"# Go Mutex Comparision\n\nMutex vs RWMutex vs sync.Map, Concurrency map benchmark in different concurrent scenarios.\n\n## Methods\n\nCheck all the methods and code here [benchmark/methods.go](benchmark/methods.go)\n\n### 1. sync.Map\n\nWrite\n\n```go\nsyncMap.Store(key, key)\n```\n\nRandom Read\n\n```go\nv, ok := syncMap.Load(key)\nif !ok {\n}\nv = v\n```\n\nRange Read All\n\n```go\nsyncMap.Range(func(k, v interface{}) bool {\n    k = k\n    v = v\n    return true\n})\n```\n\n### 2. sync.Mutex\n\nWrite\n\n```go\nmutex.Lock()\nmutexMap[key] = key\nmutex.Unlock()\n```\n\nRandom Read\n\n```go\nmutex.Lock()\nv, ok := mutexMap[key]\nif !ok {\n}\nv = v\nmutex.Unlock()\n```\n\nRange Read All\n\n```go\nmutex.Lock()\nfor k, v := range mutexMap {\n    k = k\n    v = v\n}\nmutex.Unlock()\n```\n\n### 3. sync.RWMutex\n\nWrite\n\n```go\nrwMutex.Lock()\nrwMutexMap[key] = key\nrwMutex.Unlock()\n```\n\nRandom Read\n\n```go\nrwMutex.RLock()\nv, ok := rwMutexMap[key]\nif !ok {\n}\nv = v\nrwMutex.RUnlock()\n```\n\nRange Read All\n\n```go\nrwMutex.RLock()\nfor k, v := range rwMutexMap {\n    k = k\n    v = v\n}\nrwMutex.RUnlock()\n```\n\n### 4. orcaman/concurrent-map\n\nWrite\n\n```go\ncMap.Set(key, key)\n```\n\nRandom Read\n\n```go\nv, ok := cMap.Get(key)\nif !ok {\n}\nv = v\n```\n\nRange Read All\n\n```go\nfor i := range cMap.IterBuffered() {\n    i = i\n}\n```\n\n## Test scenarios\n\nCheck all the test scenarios here [benchmark/scenarios.go](benchmark/scenarios.go)\n\n### 10 concurrents 100k write\n\n| Method                 | Test                                  | Time         |\n| ---------------------- | ------------------------------------- | ------------ |\n| orcaman/concurrent-map | write (10 concurrents) (100000 iters) | 62.288221ms  |\n| RWMutex                | write (10 concurrents) (100000 iters) | 113.321432ms |\n| Mutex                  | write (10 concurrents) (100000 iters) | 121.2995ms   |\n| sync.Map               | write (10 concurrents) (100000 iters) | 203.216039ms |\n\n### 10 concurrents 100k random read\n\n| Method                 | Test                                        | Time        |\n| ---------------------- | ------------------------------------------- | ----------- |\n| orcaman/concurrent-map | random_read (10 concurrents) (100000 iters) | 15.110771ms |\n| RWMutex                | random_read (10 concurrents) (100000 iters) | 30.6894ms   |\n| sync.Map               | random_read (10 concurrents) (100000 iters) | 38.139147ms |\n| Mutex                  | random_read (10 concurrents) (100000 iters) | 85.278314ms |\n\n### 10 concurrents 100 range read all\n\n| Method                 | Test                                    | Time         |\n| ---------------------- | --------------------------------------- | ------------ |\n| RWMutex                | range_read (10 concurrents) (100 iters) | 143.054227ms |\n| Mutex                  | range_read (10 concurrents) (100 iters) | 905.993286ms |\n| sync.Map               | range_read (10 concurrents) (100 iters) | 949.263514ms |\n| orcaman/concurrent-map | range_read (10 concurrents) (100 iters) | 2.366558255s |\n\n### 50 concurrents 20k write\n\n| Method                 | Test                                 | Time         |\n| ---------------------- | ------------------------------------ | ------------ |\n| sync.Map               | write (50 concurrents) (20000 iters) | 22.123396ms  |\n| orcaman/concurrent-map | write (50 concurrents) (20000 iters) | 30.682173ms  |\n| Mutex                  | write (50 concurrents) (20000 iters) | 122.591997ms |\n| RWMutex                | write (50 concurrents) (20000 iters) | 134.832297ms |\n\n### 50 concurrents 20k random read\n\n| Method                 | Test                                       | Time         |\n| ---------------------- | ------------------------------------------ | ------------ |\n| sync.Map               | random_read (50 concurrents) (20000 iters) | 7.055942ms   |\n| orcaman/concurrent-map | random_read (50 concurrents) (20000 iters) | 12.597161ms  |\n| RWMutex                | random_read (50 concurrents) (20000 iters) | 32.372341ms  |\n| Mutex                  | random_read (50 concurrents) (20000 iters) | 118.862146ms |\n\n### 50 concurrents 20 range read all\n\n| Method                 | Test                                   | Time         |\n| ---------------------- | -------------------------------------- | ------------ |\n| RWMutex                | range_read (50 concurrents) (20 iters) | 104.010416ms |\n| sync.Map               | range_read (50 concurrents) (20 iters) | 577.479455ms |\n| Mutex                  | range_read (50 concurrents) (20 iters) | 863.322488ms |\n| orcaman/concurrent-map | range_read (50 concurrents) (20 iters) | 1.715899163s |\n\n### 100 concurrents 10k write\n\n| Method                 | Test                                   | Time         |\n| ---------------------- | -------------------------------------- | ------------ |\n| sync.Map               | write (100 concurrents) (100000 iters) | 260.946224ms |\n| orcaman/concurrent-map | write (100 concurrents) (100000 iters) | 349.440739ms |\n| Mutex                  | write (100 concurrents) (100000 iters) | 1.630196524s |\n| RWMutex                | write (100 concurrents) (100000 iters) | 1.680058588s |\n\n### 100 concurrents 10k random read\n\n| Method                 | Test                                         | Time         |\n| ---------------------- | -------------------------------------------- | ------------ |\n| sync.Map               | random_read (100 concurrents) (100000 iters) | 119.658652ms |\n| orcaman/concurrent-map | random_read (100 concurrents) (100000 iters) | 126.84391ms  |\n| RWMutex                | random_read (100 concurrents) (100000 iters) | 280.359023ms |\n| Mutex                  | random_read (100 concurrents) (100000 iters) | 1.644604438s |\n\n### 100 concurrents 10 range read all\n\n| Method                 | Test                                    | Time         |\n| ---------------------- | --------------------------------------- | ------------ |\n| RWMutex                | range_read (100 concurrents) (10 iters) | 95.519575ms  |\n| sync.Map               | range_read (100 concurrents) (10 iters) | 836.398188ms |\n| Mutex                  | range_read (100 concurrents) (10 iters) | 972.755566ms |\n| orcaman/concurrent-map | range_read (100 concurrents) (10 iters) | 2.795446594s |\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntsd%2Fgo-mutex-comparison","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fntsd%2Fgo-mutex-comparison","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntsd%2Fgo-mutex-comparison/lists"}