{"id":27880845,"url":"https://github.com/atomicgo/counter","last_synced_at":"2025-07-25T00:36:24.762Z","repository":{"id":64300003,"uuid":"570292216","full_name":"atomicgo/counter","owner":"atomicgo","description":"🔢 Counter is a fast, thread-safe counter. It collects statstics, like current rate, min / max rate, etc.","archived":false,"fork":false,"pushed_at":"2025-03-14T22:57:13.000Z","size":62,"stargazers_count":7,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-13T09:23:36.598Z","etag":null,"topics":["atomicgo","go","golang","golang-library"],"latest_commit_sha":null,"homepage":"https://atomicgo.dev","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/atomicgo.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},"funding":{"github":["MarvinJWendt"]}},"created_at":"2022-11-24T20:11:34.000Z","updated_at":"2025-03-14T22:57:16.000Z","dependencies_parsed_at":"2024-06-20T00:12:08.413Z","dependency_job_id":"e4cee204-0237-4411-9b6c-8bee9c8930b2","html_url":"https://github.com/atomicgo/counter","commit_stats":{"total_commits":15,"total_committers":2,"mean_commits":7.5,"dds":0.06666666666666665,"last_synced_commit":"c3147914147614e1a4bc446b4edeb4206e795a4b"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":"atomicgo/template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fcounter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fcounter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fcounter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fcounter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atomicgo","download_url":"https://codeload.github.com/atomicgo/counter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252442480,"owners_count":21748448,"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":["atomicgo","go","golang","golang-library"],"created_at":"2025-05-05T04:38:30.929Z","updated_at":"2025-05-05T04:38:31.682Z","avatar_url":"https://github.com/atomicgo.png","language":"Go","funding_links":["https://github.com/sponsors/MarvinJWendt"],"categories":[],"sub_categories":[],"readme":"\u003c!--\n\n\n\n┌───────────────────────────────────────────────────────────────────┐\n│                                                                   │\n│                          IMPORTANT NOTE                           │\n│                                                                   │\n│               This file is automatically generated                │\n│           All manual modifications will be overwritten            │\n│                                                                   │\n└───────────────────────────────────────────────────────────────────┘\n\n\n\n--\u003e\n\n\u003ch1 align=\"center\"\u003eAtomicGo | counter\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fatomicgo.dev%2Fapi%2Fshields%2Fcounter\u0026style=flat-square\" alt=\"Downloads\"\u003e\n\n\u003ca href=\"https://github.com/atomicgo/counter/releases\"\u003e\n\u003cimg src=\"https://img.shields.io/github/v/release/atomicgo/counter?style=flat-square\" alt=\"Latest Release\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/counter\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/atomicgo/counter/go.yml?style=flat-square\" alt=\"Tests\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/counter\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/codecov/c/gh/atomicgo/counter?color=magenta\u0026logo=codecov\u0026style=flat-square\" alt=\"Coverage\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/counter\"\u003e\n\u003c!-- unittestcount:start --\u003e\u003cimg src=\"https://img.shields.io/badge/Unit_Tests-13-magenta?style=flat-square\" alt=\"Unit test count\"\u003e\u003c!-- unittestcount:end --\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://opensource.org/licenses/MIT\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square\" alt=\"License: MIT\"\u003e\n\u003c/a\u003e\n  \n\u003ca href=\"https://goreportcard.com/report/github.com/atomicgo/counter\" target=\"_blank\"\u003e\n\u003cimg src=\"https://goreportcard.com/badge/github.com/atomicgo/counter?style=flat-square\" alt=\"Go report\"\u003e\n\u003c/a\u003e   \n\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n\u003cstrong\u003e\u003ca href=\"https://pkg.go.dev/atomicgo.dev/counter#section-documentation\" target=\"_blank\"\u003eDocumentation\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CONTRIBUTING.md\" target=\"_blank\"\u003eContributing\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CODE_OF_CONDUCT.md\" target=\"_blank\"\u003eCode of Conduct\u003c/a\u003e\u003c/strong\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/atomicgo/atomicgo/main/assets/header.png\" alt=\"AtomicGo\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\u003ch3  align=\"center\"\u003e\u003cpre\u003ego get atomicgo.dev/counter\u003c/pre\u003e\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\n\u003c!-- gomarkdoc:embed:start --\u003e\n\n\u003c!-- Code generated by gomarkdoc. DO NOT EDIT --\u003e\n\n# counter\n\n```go\nimport \"atomicgo.dev/counter\"\n```\n\nPackage counter implements an advanced, fast and thread\\-safe counter. It optionally collects statistics, like current rate, min / max rate, etc.\n\n## Index\n\n- [type Counter](\u003c#Counter\u003e)\n  - [func NewCounter\\(\\) \\*Counter](\u003c#NewCounter\u003e)\n  - [func \\(c \\*Counter\\) CalculateAverageRate\\(interval time.Duration\\) float64](\u003c#Counter.CalculateAverageRate\u003e)\n  - [func \\(c \\*Counter\\) CalculateMaximumRate\\(interval time.Duration\\) float64](\u003c#Counter.CalculateMaximumRate\u003e)\n  - [func \\(c \\*Counter\\) CalculateMinimumRate\\(interval time.Duration\\) float64](\u003c#Counter.CalculateMinimumRate\u003e)\n  - [func \\(c \\*Counter\\) Count\\(\\) uint64](\u003c#Counter.Count\u003e)\n  - [func \\(c \\*Counter\\) Increment\\(\\)](\u003c#Counter.Increment\u003e)\n  - [func \\(c \\*Counter\\) Reset\\(\\)](\u003c#Counter.Reset\u003e)\n  - [func \\(c \\*Counter\\) Start\\(\\) \\*Counter](\u003c#Counter.Start\u003e)\n  - [func \\(c \\*Counter\\) Stop\\(\\)](\u003c#Counter.Stop\u003e)\n  - [func \\(c \\*Counter\\) WithAdvancedStats\\(\\) \\*Counter](\u003c#Counter.WithAdvancedStats\u003e)\n\n\n\u003ca name=\"Counter\"\u003e\u003c/a\u003e\n## type [Counter](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L24-L41\u003e)\n\nCounter is a fast, thread\\-safe counter. It collects statistics, like current rate, min / max rate, etc. The Counter can go up to \\`18446744073709551615\\` \\(2^64 \\- 1\\), as it uses uint64 internally.\n\nBasic usage:\n\n```\nc := counter.NewCounter().Start()\nc.Increment()\nfmt.Println(c.Count()) // prints 1\nc.Stop()\nrate := c.CalculateAverageRate(time.Second) // events per second\n```\n\n```go\ntype Counter struct {\n    // contains filtered or unexported fields\n}\n```\n\n\u003ca name=\"NewCounter\"\u003e\u003c/a\u003e\n### func [NewCounter](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L46\u003e)\n\n```go\nfunc NewCounter() *Counter\n```\n\nNewCounter returns a new Counter.\n\nThe counter starts in a stopped state. Call Start\\(\\) to begin counting.\n\n\u003ca name=\"Counter.CalculateAverageRate\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [CalculateAverageRate](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L172\u003e)\n\n```go\nfunc (c *Counter) CalculateAverageRate(interval time.Duration) float64\n```\n\nCalculateAverageRate calculates the average rate of the counter. It returns the rate in \\`count / interval\\`.\n\nFor example, to get events per second:\n\n```\nrate := counter.CalculateAverageRate(time.Second)\n```\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"atomicgo.dev/counter\"\n)\n\nfunc main() {\n\tc := counter.NewCounter().Start()\n\n\tfor i := 0; i \u003c 10; i++ {\n\t\ttime.Sleep(100 * time.Millisecond)\n\t\tc.Increment()\n\t}\n\n\tc.Stop()\n\n\tfmt.Println(c.CalculateAverageRate(time.Second))\n\t// Output should be around 10, as we incremented 10 times in 1 second\n}\n```\n\n\n\n\u003ca name=\"Counter.CalculateMaximumRate\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [CalculateMaximumRate](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L200\u003e)\n\n```go\nfunc (c *Counter) CalculateMaximumRate(interval time.Duration) float64\n```\n\nCalculateMaximumRate calculates the maximum rate of the counter. It returns the rate in \\`count / interval\\`. It returns 0 if the counter has not been started yet or has no increments. Needs to be enabled via WithAdvancedStats.\n\nThe maximum rate represents the fastest pace at which events occurred.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"atomicgo.dev/counter\"\n)\n\nfunc main() {\n\tc := counter.NewCounter().WithAdvancedStats().Start()\n\n\tfor i := 0; i \u003c 10; i++ {\n\t\ttime.Sleep(100 * time.Millisecond)\n\t\tc.Increment()\n\t}\n\n\tc.Stop()\n\n\tfmt.Println(c.CalculateMaximumRate(time.Second))\n\t// Output should be around 10, as we incremented 10 times in 1 second\n}\n```\n\n\n\n\u003ca name=\"Counter.CalculateMinimumRate\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [CalculateMinimumRate](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L221\u003e)\n\n```go\nfunc (c *Counter) CalculateMinimumRate(interval time.Duration) float64\n```\n\nCalculateMinimumRate calculates the minimum rate of the counter. It returns the rate in \\`count / interval\\`. It returns 0 if the counter has not been started yet or has no increments. Needs to be enabled via WithAdvancedStats.\n\nThe minimum rate represents the slowest pace at which events occurred.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"atomicgo.dev/counter\"\n)\n\nfunc main() {\n\tc := counter.NewCounter().WithAdvancedStats().Start()\n\n\tfor i := 0; i \u003c 10; i++ {\n\t\ttime.Sleep(100 * time.Millisecond)\n\t\tc.Increment()\n\t}\n\n\tc.Stop()\n\n\tfmt.Println(c.CalculateMinimumRate(time.Second))\n\t// Output should be around 10, as we incremented 10 times in 1 second\n}\n```\n\n\n\n\u003ca name=\"Counter.Count\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [Count](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L145\u003e)\n\n```go\nfunc (c *Counter) Count() uint64\n```\n\nCount returns the current count.\n\nThis method is thread\\-safe and can be called concurrently from multiple goroutines.\n\n\u003ca name=\"Counter.Increment\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [Increment](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L107\u003e)\n\n```go\nfunc (c *Counter) Increment()\n```\n\nIncrement increments the counter by 1.\n\nThis method is thread\\-safe and can be called concurrently from multiple goroutines.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"atomicgo.dev/counter\"\n)\n\nfunc main() {\n\tc := counter.NewCounter().Start()\n\tfor i := 0; i \u003c 10; i++ {\n\t\tc.Increment()\n\t}\n\n\tc.Stop()\n\n\tfmt.Println(c.Count())\n}\n```\n\n#### Output\n\n```\n10\n```\n\n\n\n\u003ca name=\"Counter.Reset\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [Reset](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L152\u003e)\n\n```go\nfunc (c *Counter) Reset()\n```\n\nReset stops and resets the counter.\n\nThis resets the count to 0 and clears all statistics.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"atomicgo.dev/counter\"\n)\n\nfunc main() {\n\tc := counter.NewCounter().Start()\n\tfor i := 0; i \u003c 10; i++ {\n\t\tc.Increment()\n\t}\n\n\tc.Reset()\n\n\tfmt.Println(c.Count())\n}\n```\n\n#### Output\n\n```\n0\n```\n\n\n\n\u003ca name=\"Counter.Start\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [Start](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L70\u003e)\n\n```go\nfunc (c *Counter) Start() *Counter\n```\n\nStart starts the counter. It returns the counter itself, so you can chain it.\n\nIf the counter is already started, this is a no\\-op.\n\n\u003ca name=\"Counter.Stop\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [Stop](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L92\u003e)\n\n```go\nfunc (c *Counter) Stop()\n```\n\nStop stops the counter.\n\nThis freezes the counter for rate calculations but does not reset the count. If the counter is already stopped, this is a no\\-op.\n\n\u003ca name=\"Counter.WithAdvancedStats\"\u003e\u003c/a\u003e\n### func \\(\\*Counter\\) [WithAdvancedStats](\u003chttps://github.com/atomicgo/counter/blob/main/counter.go#L59\u003e)\n\n```go\nfunc (c *Counter) WithAdvancedStats() *Counter\n```\n\nWithAdvancedStats enables the calculation of advanced statistics like CalculateMinimumRate and CalculateMaximumRate. CalculateAverageRate and CalculateCurrentRate are always enabled.\n\nNote: Enabling advanced stats will increase memory usage proportional to the number of increments.\n\nGenerated by [gomarkdoc](\u003chttps://github.com/princjef/gomarkdoc\u003e)\n\n\n\u003c!-- gomarkdoc:embed:end --\u003e\n\n---\n\n\u003e [AtomicGo.dev](https://atomicgo.dev) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e with ❤️ by [@MarvinJWendt](https://github.com/MarvinJWendt) |\n\u003e [MarvinJWendt.com](https://marvinjwendt.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fcounter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatomicgo%2Fcounter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fcounter/lists"}