Benchmarks
This page compares VarMQ with other Go worker pools, Redis job queues and SQLite job queues. Every row on it is one line of the raw go test -bench output in goptics/benchmarks, and every figure is read from those rows or averaged over them. The run is from 2026-10-25, with varmq v1.10.0, at commit a0d0e0b. The page holds all 1,667 rows of that run. Each result links to its line in the raw file.
Explore the rows
Section titled “Explore the rows”Pick a dataset and narrow it with the selects: each lane is one subject’s mean over the groups in scope, and its last column divides it by VarMQ. Press a square in the map to see one group, with a link to each of its rows in the raw file.
Worker pool, GOMAXPROCS 24, 8 and 4
The three pool files read together. A mean here averages the 24, 8 and 4 CPU runs.
165 groups in scope · VarMQ leads 91, others 74 · 9 subjects
Tasks per second
tasks/s · higher is better · mean of 165 groups- VarMQwon 91 of 165 4,479,925 1.00 times VarMQ, the baseline
- BufferedPool †won 47 of 165 3,694,917 0.82 times VarMQ, behind VarMQ
- ErrGroupwon 22 of 165 2,131,294 0.48 times VarMQ, behind VarMQ
- Gopoolwon 1 of 165 2,027,999 0.45 times VarMQ, behind VarMQ
- Antswon 4 of 165 1,960,521 0.44 times VarMQ, behind VarMQ
- GoroutinePool †won 0 of 165 1,625,000 0.36 times VarMQ, behind VarMQ
- Concwon 0 of 165 1,326,509 0.30 times VarMQ, behind VarMQ
- WorkerPoolwon 0 of 165 1,221,358 0.27 times VarMQ, behind VarMQ
- Pondwon 0 of 165 655,940 0.15 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
† A baseline, not a library: N goroutines reading one channel. The buffered one holds all 1M tasks.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| 24 CPUs | 8 CPUs | 4 CPUs | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Task · workers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers |
| Sleep10ms · 50K | |||||||||||||||
| Loop10 · 50K | |||||||||||||||
| Sleep5msLoop5 · 50K | |||||||||||||||
| Sleep10ms · 100K | |||||||||||||||
| Loop10 · 100K | |||||||||||||||
| Sleep5msLoop5 · 100K | |||||||||||||||
| Sleep10ms · 300K | |||||||||||||||
| Loop10 · 300K | |||||||||||||||
| Sleep5msLoop5 · 300K | |||||||||||||||
| Loop10 · 1 worker | |||||||||||||||
| Loop10K · 1 worker | |||||||||||||||
- VQVarMQ91
- BPBufferedPool †47
- EGErrGroup22
- ANAnts4
- GPGopool1
Where VarMQ does not win
Another subject has the fastest throughput in 74 groups of 165. VarMQ has it in 91.
- BufferedPool † 47 groups
- ErrGroup 22 groups
- Ants 4 groups
- Gopool 1 group
All 74 groups where VarMQ does not win, biggest gap first
| Group | Best | VarMQ | Ahead by | Source |
|---|---|---|---|---|
| Loop10, 1 worker, 1 producer, 24 CPUs | BufferedPool † 26,076,554 | 5,612,142 3 of 9 | 4.65× | 24cpu L410–418 |
| Loop10, 1 worker, 1K producers, 24 CPUs | BufferedPool † 24,944,261 | 5,587,181 2 of 9 | 4.46× | 24cpu L428–436 |
| Loop10, 1 worker, 1 producer, 8 CPUs | BufferedPool † 26,148,651 | 6,326,035 3 of 9 | 4.13× | 8cpu L410–418 |
| Loop10, 1 worker, 1 producer, 4 CPUs | BufferedPool † 26,202,379 | 6,632,332 3 of 9 | 3.95× | 4cpu L410–418 |
| Loop10, 1 worker, 100 producers, 8 CPUs | BufferedPool † 27,854,937 | 7,090,918 2 of 9 | 3.93× | 8cpu L419–427 |
| Loop10, 1 worker, 100 producers, 24 CPUs | BufferedPool † 25,921,880 | 6,768,459 2 of 9 | 3.83× | 24cpu L419–427 |
| Loop10, 1 worker, 100 producers, 4 CPUs | BufferedPool † 27,380,238 | 7,308,651 2 of 9 | 3.75× | 4cpu L419–427 |
| Loop10, 1 worker, 1K producers, 4 CPUs | BufferedPool † 26,829,003 | 7,342,679 2 of 9 | 3.65× | 4cpu L428–436 |
| Loop10, 1 worker, 1K producers, 8 CPUs | BufferedPool † 26,084,154 | 7,190,233 2 of 9 | 3.63× | 8cpu L428–436 |
| Loop10, 1 worker, 10K producers, 8 CPUs | BufferedPool † 24,737,062 | 7,177,970 2 of 9 | 3.45× | 8cpu L437–445 |
| Loop10, 1 worker, 10K producers, 4 CPUs | BufferedPool † 23,643,298 | 7,271,060 2 of 9 | 3.25× | 4cpu L437–445 |
| Loop10, 1 worker, 10K producers, 24 CPUs | BufferedPool † 21,230,114 | 6,584,676 2 of 9 | 3.22× | 24cpu L437–445 |
| Sleep10ms, 50K workers, 1 producer, 4 CPUs | BufferedPool † 3,736,757 | 2,504,306 2 of 9 | 1.49× | 4cpu L5–13 |
| Sleep10ms, 50K workers, 1K producers, 4 CPUs | BufferedPool † 3,674,940 | 2,481,416 2 of 9 | 1.48× | 4cpu L23–31 |
| Sleep10ms, 50K workers, 10K producers, 4 CPUs | BufferedPool † 3,662,015 | 2,491,621 2 of 9 | 1.47× | 4cpu L32–40 |
| Sleep10ms, 50K workers, 100 producers, 4 CPUs | BufferedPool † 3,673,447 | 2,554,864 2 of 9 | 1.44× | 4cpu L14–22 |
| Sleep10ms, 100K workers, 1M producers, 4 CPUs | ErrGroup 1,967,247 | 1,373,342 6 of 9 | 1.43× | 4cpu L176–184 |
| Sleep10ms, 300K workers, 1M producers, 4 CPUs | ErrGroup 1,951,801 | 1,392,523 4 of 9 | 1.40× | 4cpu L311–319 |
| Sleep5msLoop5, 300K workers, 1M producers, 4 CPUs | ErrGroup 2,107,373 | 1,521,728 4 of 9 | 1.38× | 4cpu L401–409 |
| Sleep10ms, 50K workers, 1M producers, 4 CPUs | ErrGroup 1,968,705 | 1,436,960 6 of 9 | 1.37× | 4cpu L41–49 |
| Sleep5msLoop5, 100K workers, 1M producers, 4 CPUs | ErrGroup 2,040,959 | 1,491,073 4 of 9 | 1.37× | 4cpu L266–274 |
| Sleep5msLoop5, 50K workers, 1M producers, 4 CPUs | ErrGroup 2,047,829 | 1,499,597 6 of 9 | 1.37× | 4cpu L131–139 |
| Sleep10ms, 50K workers, 1 producer, 8 CPUs | BufferedPool † 3,939,669 | 3,176,393 2 of 9 | 1.24× | 8cpu L5–13 |
| Sleep5msLoop5, 300K workers, 1M producers, 8 CPUs | ErrGroup 3,068,841 | 2,482,123 2 of 9 | 1.24× | 8cpu L401–409 |
| Sleep5msLoop5, 300K workers, 1 producer, 8 CPUs | ErrGroup 2,997,183 | 2,459,278 2 of 9 | 1.22× | 8cpu L365–373 |
| Sleep10ms, 50K workers, 10K producers, 8 CPUs | BufferedPool † 3,731,132 | 3,169,295 2 of 9 | 1.18× | 8cpu L32–40 |
| Loop10, 1 worker, 1M producers, 24 CPUs | BufferedPool † 4,756,005 | 4,048,978 2 of 9 | 1.17× | 24cpu L446–454 |
| Sleep5msLoop5, 300K workers, 1 producer, 4 CPUs | ErrGroup 2,540,219 | 2,180,862 3 of 9 | 1.16× | 4cpu L365–373 |
| Sleep10ms, 50K workers, 100 producers, 8 CPUs | BufferedPool † 3,813,389 | 3,274,819 2 of 9 | 1.16× | 8cpu L14–22 |
| Sleep10ms, 50K workers, 1K producers, 8 CPUs | BufferedPool † 3,800,703 | 3,266,799 2 of 9 | 1.16× | 8cpu L23–31 |
| Sleep5msLoop5, 50K workers, 100 producers, 4 CPUs | BufferedPool † 3,332,321 | 2,873,030 2 of 9 | 1.16× | 4cpu L104–112 |
| Sleep10ms, 300K workers, 1 producer, 4 CPUs | ErrGroup 2,282,556 | 1,972,243 3 of 9 | 1.16× | 4cpu L275–283 |
| Sleep5msLoop5, 50K workers, 10K producers, 4 CPUs | BufferedPool † 3,185,706 | 2,771,238 2 of 9 | 1.15× | 4cpu L122–130 |
| Sleep10ms, 300K workers, 1 producer, 8 CPUs | ErrGroup 2,784,449 | 2,455,963 2 of 9 | 1.13× | 8cpu L275–283 |
| Sleep10ms, 50K workers, 10K producers, 24 CPUs | BufferedPool † 2,962,595 | 2,632,451 2 of 9 | 1.13× | 24cpu L32–40 |
| Sleep10ms, 300K workers, 100 producers, 4 CPUs | Ants 2,132,405 | 1,900,906 3 of 9 | 1.12× | 4cpu L284–292 |
| Sleep5msLoop5, 300K workers, 1 producer, 24 CPUs | ErrGroup 2,543,927 | 2,275,746 2 of 9 | 1.12× | 24cpu L365–373 |
| Sleep10ms, 300K workers, 1M producers, 24 CPUs | ErrGroup 2,161,621 | 1,937,685 2 of 9 | 1.12× | 24cpu L311–319 |
| Loop10, 1 worker, 1M producers, 4 CPUs | BufferedPool † 4,798,241 | 4,304,050 2 of 9 | 1.11× | 4cpu L446–454 |
| Sleep5msLoop5, 300K workers, 1K producers, 4 CPUs | Ants 2,338,347 | 2,136,678 2 of 9 | 1.09× | 4cpu L383–391 |
| Sleep10ms, 50K workers, 100 producers, 24 CPUs | BufferedPool † 3,011,339 | 2,771,948 2 of 9 | 1.09× | 24cpu L14–22 |
| Sleep5msLoop5, 50K workers, 1K producers, 4 CPUs | BufferedPool † 3,101,827 | 2,860,632 2 of 9 | 1.08× | 4cpu L113–121 |
| Sleep10ms, 300K workers, 1 producer, 24 CPUs | ErrGroup 2,293,517 | 2,135,964 2 of 9 | 1.07× | 24cpu L275–283 |
| Sleep10ms, 300K workers, 1K producers, 4 CPUs | Ants 2,212,462 | 2,070,837 2 of 9 | 1.07× | 4cpu L293–301 |
| Sleep10ms, 50K workers, 1K producers, 24 CPUs | BufferedPool † 2,915,777 | 2,741,551 2 of 9 | 1.06× | 24cpu L23–31 |
| Sleep10ms, 100K workers, 100 producers, 4 CPUs | BufferedPool † 2,572,532 | 2,423,256 2 of 9 | 1.06× | 4cpu L149–157 |
| Loop10K, 1 worker, 1 producer, 8 CPUs | BufferedPool † 337,903 | 322,978 3 of 9 | 1.05× | 8cpu L455–463 |
| Sleep5msLoop5, 100K workers, 1M producers, 8 CPUs | ErrGroup 2,879,461 | 2,757,349 2 of 9 | 1.04× | 8cpu L266–274 |
| Sleep10ms, 50K workers, 1M producers, 8 CPUs | ErrGroup 2,732,450 | 2,628,276 2 of 9 | 1.04× | 8cpu L41–49 |
| Loop10K, 1 worker, 100 producers, 24 CPUs | BufferedPool † 334,515 | 322,322 3 of 9 | 1.04× | 24cpu L464–472 |
| Loop10K, 1 worker, 1 producer, 24 CPUs | Gopool 336,425 | 324,485 3 of 9 | 1.04× | 24cpu L455–463 |
| Loop10K, 1 worker, 10K producers, 8 CPUs | BufferedPool † 337,132 | 325,199 2 of 9 | 1.04× | 8cpu L482–490 |
| Loop10K, 1 worker, 1K producers, 8 CPUs | BufferedPool † 336,500 | 325,224 2 of 9 | 1.03× | 8cpu L473–481 |
| Loop10K, 1 worker, 1K producers, 24 CPUs | BufferedPool † 333,606 | 322,936 2 of 9 | 1.03× | 24cpu L473–481 |
| Loop10K, 1 worker, 1M producers, 24 CPUs | BufferedPool † 322,314 | 312,975 2 of 9 | 1.03× | 24cpu L491–499 |
| Loop10K, 1 worker, 10K producers, 24 CPUs | BufferedPool † 333,318 | 323,713 2 of 9 | 1.03× | 24cpu L482–490 |
| Loop10K, 1 worker, 1 producer, 4 CPUs | BufferedPool † 333,826 | 324,401 3 of 9 | 1.03× | 4cpu L455–463 |
| Loop10K, 1 worker, 1K producers, 4 CPUs | BufferedPool † 334,843 | 325,729 2 of 9 | 1.03× | 4cpu L473–481 |
| Loop10, 1 worker, 1M producers, 8 CPUs | BufferedPool † 5,320,750 | 5,181,886 2 of 9 | 1.03× | 8cpu L446–454 |
| Loop10K, 1 worker, 1M producers, 4 CPUs | BufferedPool † 333,400 | 325,027 3 of 9 | 1.03× | 4cpu L491–499 |
| Loop10K, 1 worker, 100 producers, 8 CPUs | BufferedPool † 334,568 | 326,262 2 of 9 | 1.03× | 8cpu L464–472 |
| Sleep10ms, 100K workers, 1K producers, 4 CPUs | BufferedPool † 2,526,768 | 2,464,268 2 of 9 | 1.03× | 4cpu L158–166 |
| Loop10K, 1 worker, 100 producers, 4 CPUs | BufferedPool † 332,585 | 324,909 2 of 9 | 1.02× | 4cpu L464–472 |
| Loop10K, 1 worker, 10K producers, 4 CPUs | BufferedPool † 333,216 | 325,666 2 of 9 | 1.02× | 4cpu L482–490 |
| Sleep10ms, 100K workers, 1 producer, 4 CPUs | ErrGroup 2,326,813 | 2,277,277 2 of 9 | 1.02× | 4cpu L140–148 |
| Sleep5msLoop5, 100K workers, 1K producers, 4 CPUs | BufferedPool † 2,737,841 | 2,685,087 2 of 9 | 1.02× | 4cpu L248–256 |
| Sleep10ms, 300K workers, 10K producers, 8 CPUs | ErrGroup 2,815,102 | 2,766,179 2 of 9 | 1.02× | 8cpu L302–310 |
| Sleep10ms, 100K workers, 1M producers, 8 CPUs | ErrGroup 2,675,045 | 2,629,661 2 of 9 | 1.02× | 8cpu L176–184 |
| Loop10K, 1 worker, 1M producers, 8 CPUs | BufferedPool † 328,842 | 324,508 2 of 9 | 1.01× | 8cpu L491–499 |
| Sleep5msLoop5, 300K workers, 100 producers, 4 CPUs | Ants 2,276,359 | 2,261,985 2 of 9 | 1.01× | 4cpu L374–382 |
| Sleep10ms, 100K workers, 10K producers, 4 CPUs | BufferedPool † 2,439,078 | 2,423,984 2 of 9 | 1.01× | 4cpu L167–175 |
| Sleep10ms, 300K workers, 1M producers, 8 CPUs | ErrGroup 2,669,081 | 2,660,367 2 of 9 | 1.00× | 8cpu L311–319 |
| Sleep10ms, 300K workers, 10K producers, 4 CPUs | ErrGroup 2,115,244 | 2,108,599 2 of 9 | 1.00× | 4cpu L302–310 |
| Sleep5msLoop5, 300K workers, 10K producers, 4 CPUs | ErrGroup 2,226,923 | 2,220,232 2 of 9 | 1.00× | 4cpu L392–400 |
Every row behind these numbers · 165 groups
| Group | VarMQ | Ants | WorkerPool | Conc | ErrGroup | Gopool | GoroutinePool † | BufferedPool † | Pond | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| Sleep10ms, 50K workers, 1 producer, 24 CPUs | 2,912,550 (best) | 1,519,070 | 656,765 | 1,429,409 | 1,794,858 | 954,564 | 1,339,549 | 1,537,452 | 399,351 | 24cpu L5–13 |
| Sleep10ms, 50K workers, 100 producers, 24 CPUs | 2,771,948 | 2,035,061 | 1,015,615 | 1,619,384 | 1,582,002 | 1,361,653 | 1,017,638 | 3,011,339 (best) | 368,806 | 24cpu L14–22 |
| Sleep10ms, 50K workers, 1K producers, 24 CPUs | 2,741,551 | 2,077,158 | 1,156,901 | 586,431 | 1,464,832 | 1,141,372 | 778,011 | 2,915,777 (best) | 284,263 | 24cpu L23–31 |
| Sleep10ms, 50K workers, 10K producers, 24 CPUs | 2,632,451 | 1,884,900 | 973,489 | 497,178 | 1,268,658 | 1,189,586 | 1,137,502 | 2,962,595 (best) | 415,109 | 24cpu L32–40 |
| Sleep10ms, 50K workers, 1M producers, 24 CPUs | 2,553,298 (best) | 1,382,534 | 864,947 | 1,251,845 | 1,758,812 | 1,403,797 | 1,319,959 | 1,261,415 | 410,218 | 24cpu L41–49 |
| Loop10, 50K workers, 1 producer, 24 CPUs | 7,391,698 (best) | 1,990,627 | 1,811,122 | 1,293,970 | 2,330,329 | 1,342,225 | 1,604,738 | 1,567,348 | 305,817 | 24cpu L50–58 |
| Loop10, 50K workers, 100 producers, 24 CPUs | 11,460,237 (best) | 2,480,988 | 880,365 | 1,231,462 | 1,588,223 | 2,005,832 | 1,144,077 | 1,069,505 | 324,663 | 24cpu L59–67 |
| Loop10, 50K workers, 1K producers, 24 CPUs | 11,943,831 (best) | 2,462,577 | 1,399,805 | 718,067 | 1,131,098 | 2,423,449 | 2,319,056 | 2,108,059 | 627,675 | 24cpu L68–76 |
| Loop10, 50K workers, 10K producers, 24 CPUs | 11,123,489 (best) | 2,097,792 | 1,587,189 | 716,207 | 1,802,430 | 2,256,852 | 1,073,129 | 1,048,061 | 422,508 | 24cpu L77–85 |
| Loop10, 50K workers, 1M producers, 24 CPUs | 3,701,745 (best) | 2,066,346 | 886,019 | 1,351,280 | 2,693,246 | 1,992,786 | 1,795,731 | 1,804,391 | 274,306 | 24cpu L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer, 24 CPUs | 3,702,257 (best) | 1,481,031 | 414,158 | 1,313,209 | 2,244,662 | 941,503 | 885,899 | 1,268,019 | 284,774 | 24cpu L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers, 24 CPUs | 4,141,394 (best) | 2,216,414 | 671,836 | 829,635 | 1,698,787 | 1,540,400 | 1,748,018 | 3,077,938 | 381,410 | 24cpu L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers, 24 CPUs | 4,081,581 (best) | 2,186,966 | 1,192,459 | 536,919 | 1,608,759 | 1,453,572 | 747,096 | 3,133,797 | 266,469 | 24cpu L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers, 24 CPUs | 3,884,958 (best) | 1,925,470 | 1,078,418 | 539,814 | 1,550,695 | 1,387,420 | 949,423 | 2,806,689 | 415,162 | 24cpu L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers, 24 CPUs | 3,013,711 (best) | 1,354,235 | 964,243 | 1,324,931 | 1,204,768 | 935,379 | 1,452,245 | 1,445,972 | 392,536 | 24cpu L131–139 |
| Sleep10ms, 100K workers, 1 producer, 24 CPUs | 3,186,940 (best) | 1,232,040 | 464,330 | 1,023,228 | 2,244,373 | 1,306,482 | 1,415,210 | 1,329,567 | 433,481 | 24cpu L140–148 |
| Sleep10ms, 100K workers, 100 producers, 24 CPUs | 3,099,420 (best) | 2,128,994 | 640,768 | 629,472 | 1,410,503 | 1,520,710 | 748,027 | 1,235,336 | 365,591 | 24cpu L149–157 |
| Sleep10ms, 100K workers, 1K producers, 24 CPUs | 3,070,265 (best) | 2,127,243 | 1,208,889 | 884,789 | 1,568,382 | 1,510,232 | 873,092 | 1,788,000 | 282,140 | 24cpu L158–166 |
| Sleep10ms, 100K workers, 10K producers, 24 CPUs | 3,106,371 (best) | 1,916,333 | 1,113,100 | 447,415 | 1,147,200 | 1,281,530 | 864,372 | 2,300,995 | 258,489 | 24cpu L167–175 |
| Sleep10ms, 100K workers, 1M producers, 24 CPUs | 2,590,761 (best) | 1,258,017 | 938,921 | 1,241,020 | 1,822,877 | 983,668 | 1,251,392 | 1,313,986 | 413,874 | 24cpu L176–184 |
| Loop10, 100K workers, 1 producer, 24 CPUs | 7,655,402 (best) | 1,797,014 | 1,780,325 | 871,350 | 2,452,591 | 650,795 | 881,705 | 1,143,310 | 258,078 | 24cpu L185–193 |
| Loop10, 100K workers, 100 producers, 24 CPUs | 12,148,546 (best) | 2,491,122 | 885,864 | 622,712 | 2,484,519 | 1,798,938 | 748,174 | 715,315 | 303,219 | 24cpu L194–202 |
| Loop10, 100K workers, 1K producers, 24 CPUs | 12,226,055 (best) | 2,448,765 | 1,587,293 | 698,892 | 1,221,789 | 2,527,880 | 841,209 | 745,780 | 302,656 | 24cpu L203–211 |
| Loop10, 100K workers, 10K producers, 24 CPUs | 10,991,630 (best) | 2,327,981 | 1,429,656 | 763,993 | 2,076,663 | 1,501,982 | 1,228,318 | 940,196 | 359,744 | 24cpu L212–220 |
| Loop10, 100K workers, 1M producers, 24 CPUs | 4,945,904 (best) | 1,972,167 | 900,888 | 1,471,112 | 2,688,984 | 1,864,032 | 1,694,485 | 1,713,957 | 195,794 | 24cpu L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer, 24 CPUs | 3,637,486 (best) | 1,447,185 | 546,915 | 1,295,835 | 2,216,760 | 918,703 | 1,049,195 | 955,075 | 245,538 | 24cpu L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers, 24 CPUs | 4,388,983 (best) | 2,254,168 | 667,374 | 732,438 | 1,975,484 | 1,396,246 | 1,435,188 | 1,681,656 | 406,611 | 24cpu L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers, 24 CPUs | 4,142,646 (best) | 2,209,361 | 1,200,520 | 681,386 | 1,505,560 | 1,461,071 | 994,664 | 1,964,340 | 287,311 | 24cpu L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers, 24 CPUs | 4,321,934 (best) | 1,998,802 | 1,095,639 | 432,165 | 1,843,065 | 1,522,098 | 892,702 | 2,146,119 | 350,291 | 24cpu L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers, 24 CPUs | 2,441,000 (best) | 1,389,629 | 974,400 | 1,240,756 | 2,252,720 | 1,114,660 | 1,309,237 | 1,300,391 | 356,724 | 24cpu L266–274 |
| Sleep10ms, 300K workers, 1 producer, 24 CPUs | 2,135,964 | 1,423,911 | 674,477 | 905,784 | 2,293,517 (best) | 1,158,774 | 1,164,541 | 1,279,765 | 404,293 | 24cpu L275–283 |
| Sleep10ms, 300K workers, 100 producers, 24 CPUs | 2,641,759 (best) | 2,103,215 | 730,914 | 943,261 | 1,168,031 | 1,139,678 | 778,535 | 711,112 | 410,141 | 24cpu L284–292 |
| Sleep10ms, 300K workers, 1K producers, 24 CPUs | 2,672,786 (best) | 2,092,344 | 1,242,138 | 1,149,947 | 1,517,095 | 1,482,393 | 709,468 | 1,087,562 | 283,971 | 24cpu L293–301 |
| Sleep10ms, 300K workers, 10K producers, 24 CPUs | 2,581,158 (best) | 1,836,557 | 1,139,974 | 597,356 | 1,487,572 | 1,353,100 | 695,951 | 883,328 | 292,336 | 24cpu L302–310 |
| Sleep10ms, 300K workers, 1M producers, 24 CPUs | 1,937,685 | 1,273,929 | 919,127 | 978,159 | 2,161,621 (best) | 659,276 | 1,147,985 | 1,127,933 | 300,361 | 24cpu L311–319 |
| Loop10, 300K workers, 1 producer, 24 CPUs | 7,061,717 (best) | 1,926,912 | 1,151,327 | 730,006 | 2,332,201 | 774,258 | 996,672 | 1,000,133 | 344,545 | 24cpu L320–328 |
| Loop10, 300K workers, 100 producers, 24 CPUs | 11,120,957 (best) | 2,468,320 | 989,128 | 568,315 | 2,783,019 | 2,042,220 | 821,431 | 786,589 | 590,471 | 24cpu L329–337 |
| Loop10, 300K workers, 1K producers, 24 CPUs | 11,837,012 (best) | 2,419,535 | 1,739,799 | 778,083 | 2,158,559 | 2,376,341 | 801,351 | 1,334,788 | 425,958 | 24cpu L338–346 |
| Loop10, 300K workers, 10K producers, 24 CPUs | 10,647,574 (best) | 2,217,089 | 1,471,641 | 831,012 | 3,177,492 | 2,714,958 | 1,130,040 | 945,233 | 324,284 | 24cpu L347–355 |
| Loop10, 300K workers, 1M producers, 24 CPUs | 4,838,041 (best) | 1,989,109 | 885,105 | 1,061,057 | 3,048,488 | 1,944,313 | 1,308,876 | 1,444,907 | 179,640 | 24cpu L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer, 24 CPUs | 2,275,746 | 1,519,060 | 538,180 | 930,919 | 2,543,927 (best) | 1,160,267 | 1,017,716 | 1,242,966 | 279,136 | 24cpu L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers, 24 CPUs | 2,702,395 (best) | 2,213,105 | 730,379 | 1,078,856 | 1,781,723 | 1,653,042 | 1,001,925 | 1,237,635 | 325,528 | 24cpu L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers, 24 CPUs | 2,617,388 (best) | 2,206,429 | 1,260,367 | 1,027,524 | 1,329,192 | 1,254,891 | 702,793 | 1,137,222 | 382,119 | 24cpu L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers, 24 CPUs | 2,471,812 (best) | 1,951,986 | 1,157,052 | 582,503 | 1,349,137 | 1,408,464 | 932,752 | 1,395,710 | 508,267 | 24cpu L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers, 24 CPUs | 1,800,531 (best) | 1,402,851 | 979,629 | 997,380 | 1,169,486 | 634,759 | 1,221,871 | 1,226,829 | 217,506 | 24cpu L401–409 |
| Loop10, 1 worker, 1 producer, 24 CPUs | 5,612,142 | 1,582,899 | 1,473,002 | 3,423,771 | 1,487,417 | 8,177,809 | 3,920,683 | 26,076,554 (best) | 3,028,169 | 24cpu L410–418 |
| Loop10, 1 worker, 100 producers, 24 CPUs | 6,768,459 | 2,076,506 | 543,788 | 463,815 | 1,313,642 | 4,157,265 | 816,034 | 25,921,880 (best) | 1,041,918 | 24cpu L419–427 |
| Loop10, 1 worker, 1K producers, 24 CPUs | 5,587,181 | 1,470,470 | 729,037 | 504,896 | 1,116,652 | 2,782,257 | 1,000,047 | 24,944,261 (best) | 870,740 | 24cpu L428–436 |
| Loop10, 1 worker, 10K producers, 24 CPUs | 6,584,676 | 1,516,219 | 709,503 | 625,526 | 2,124,776 | 3,713,812 | 1,020,295 | 21,230,114 (best) | 1,185,321 | 24cpu L437–445 |
| Loop10, 1 worker, 1M producers, 24 CPUs | 4,048,978 | 812,581 | 1,143,188 | 737,708 | 1,174,023 | 2,731,570 | 1,941,971 | 4,756,005 (best) | 1,109,138 | 24cpu L446–454 |
| Loop10K, 1 worker, 1 producer, 24 CPUs | 324,485 | 265,060 | 170,583 | 182,923 | 264,163 | 336,425 (best) | 217,878 | 335,389 | 298,315 | 24cpu L455–463 |
| Loop10K, 1 worker, 100 producers, 24 CPUs | 322,322 | 263,642 | 154,748 | 310,680 | 263,194 | 316,513 | 322,404 | 334,515 (best) | 245,228 | 24cpu L464–472 |
| Loop10K, 1 worker, 1K producers, 24 CPUs | 322,936 | 263,783 | 153,473 | 306,176 | 262,053 | 309,949 | 318,883 | 333,606 (best) | 244,325 | 24cpu L473–481 |
| Loop10K, 1 worker, 10K producers, 24 CPUs | 323,713 | 255,670 | 171,686 | 304,454 | 253,845 | 308,782 | 309,248 | 333,318 (best) | 247,535 | 24cpu L482–490 |
| Loop10K, 1 worker, 1M producers, 24 CPUs | 312,975 | 240,117 | 191,623 | 272,352 | 236,378 | 285,413 | 284,754 | 322,314 (best) | 255,940 | 24cpu L491–499 |
| Sleep10ms, 50K workers, 1 producer, 8 CPUs | 3,176,393 | 1,986,231 | 679,563 | 1,849,255 | 2,640,266 | 1,839,933 | 2,073,880 | 3,939,669 (best) | 704,764 | 8cpu L5–13 |
| Sleep10ms, 50K workers, 100 producers, 8 CPUs | 3,274,819 | 2,327,861 | 1,569,760 | 1,833,619 | 2,447,916 | 1,738,482 | 2,131,513 | 3,813,389 (best) | 710,970 | 8cpu L14–22 |
| Sleep10ms, 50K workers, 1K producers, 8 CPUs | 3,266,799 | 2,284,979 | 1,708,169 | 1,615,934 | 2,263,140 | 1,599,249 | 2,049,195 | 3,800,703 (best) | 716,863 | 8cpu L23–31 |
| Sleep10ms, 50K workers, 10K producers, 8 CPUs | 3,169,295 | 2,112,959 | 1,537,853 | 1,402,121 | 1,838,928 | 2,264,740 | 2,099,609 | 3,731,132 (best) | 779,413 | 8cpu L32–40 |
| Sleep10ms, 50K workers, 1M producers, 8 CPUs | 2,628,276 | 1,790,694 | 1,166,711 | 1,461,992 | 2,732,450 (best) | 1,655,538 | 1,659,281 | 1,665,211 | 677,640 | 8cpu L41–49 |
| Loop10, 50K workers, 1 producer, 8 CPUs | 7,671,684 (best) | 3,311,130 | 1,291,498 | 2,191,790 | 3,266,709 | 2,139,690 | 2,738,622 | 2,895,918 | 891,515 | 8cpu L50–58 |
| Loop10, 50K workers, 100 producers, 8 CPUs | 10,048,582 (best) | 2,785,465 | 2,048,257 | 2,441,882 | 2,636,984 | 2,339,683 | 2,786,947 | 4,043,435 | 804,596 | 8cpu L59–67 |
| Loop10, 50K workers, 1K producers, 8 CPUs | 9,631,427 (best) | 2,710,156 | 2,114,193 | 2,422,538 | 2,616,806 | 3,319,312 | 2,997,697 | 2,965,094 | 556,446 | 8cpu L68–76 |
| Loop10, 50K workers, 10K producers, 8 CPUs | 9,342,026 (best) | 2,559,600 | 1,957,654 | 1,820,891 | 3,112,282 | 3,348,069 | 3,124,697 | 2,298,151 | 625,787 | 8cpu L77–85 |
| Loop10, 50K workers, 1M producers, 8 CPUs | 5,183,600 (best) | 2,493,160 | 1,327,188 | 1,774,230 | 3,814,425 | 2,028,430 | 2,026,601 | 2,047,610 | 385,713 | 8cpu L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer, 8 CPUs | 4,080,137 (best) | 2,199,664 | 595,668 | 1,858,440 | 2,860,603 | 1,938,857 | 2,113,304 | 2,118,268 | 724,425 | 8cpu L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers, 8 CPUs | 4,370,254 (best) | 2,458,764 | 1,545,827 | 1,829,243 | 2,783,624 | 1,759,654 | 2,030,108 | 3,658,544 | 765,675 | 8cpu L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers, 8 CPUs | 4,342,675 (best) | 2,394,348 | 1,723,581 | 1,641,479 | 2,615,562 | 1,638,460 | 1,885,046 | 3,271,588 | 695,670 | 8cpu L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers, 8 CPUs | 3,897,961 (best) | 2,176,721 | 1,489,095 | 1,308,161 | 2,147,916 | 2,323,846 | 2,083,902 | 3,830,494 | 836,893 | 8cpu L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers, 8 CPUs | 3,066,865 (best) | 1,820,757 | 1,243,540 | 1,520,168 | 2,875,622 | 1,742,844 | 1,679,313 | 1,667,937 | 633,235 | 8cpu L131–139 |
| Sleep10ms, 100K workers, 1 producer, 8 CPUs | 3,382,564 (best) | 2,031,611 | 797,093 | 1,684,581 | 2,771,764 | 1,886,008 | 1,961,994 | 1,985,532 | 688,822 | 8cpu L140–148 |
| Sleep10ms, 100K workers, 100 producers, 8 CPUs | 3,495,042 (best) | 2,325,278 | 1,510,855 | 1,596,958 | 2,653,807 | 1,798,224 | 1,785,989 | 3,026,245 | 730,926 | 8cpu L149–157 |
| Sleep10ms, 100K workers, 1K producers, 8 CPUs | 3,404,792 (best) | 2,298,816 | 1,611,359 | 1,619,952 | 2,655,545 | 1,609,919 | 1,809,348 | 2,940,701 | 868,513 | 8cpu L158–166 |
| Sleep10ms, 100K workers, 10K producers, 8 CPUs | 3,307,640 (best) | 2,084,848 | 1,482,996 | 1,378,631 | 2,489,694 | 1,609,554 | 1,913,004 | 2,660,361 | 666,634 | 8cpu L167–175 |
| Sleep10ms, 100K workers, 1M producers, 8 CPUs | 2,629,661 | 1,743,809 | 1,209,273 | 1,341,418 | 2,675,045 (best) | 1,496,747 | 1,527,097 | 1,492,396 | 588,528 | 8cpu L176–184 |
| Loop10, 100K workers, 1 producer, 8 CPUs | 8,016,914 (best) | 3,318,506 | 915,582 | 1,962,675 | 3,223,144 | 2,125,860 | 2,315,982 | 2,467,976 | 879,748 | 8cpu L185–193 |
| Loop10, 100K workers, 100 producers, 8 CPUs | 9,973,951 (best) | 2,802,805 | 2,263,989 | 2,053,640 | 2,757,581 | 2,245,171 | 2,303,811 | 2,861,536 | 800,109 | 8cpu L194–202 |
| Loop10, 100K workers, 1K producers, 8 CPUs | 9,616,461 (best) | 2,783,820 | 2,068,040 | 2,203,184 | 2,772,634 | 3,084,433 | 2,330,652 | 2,577,287 | 864,647 | 8cpu L203–211 |
| Loop10, 100K workers, 10K producers, 8 CPUs | 9,303,365 (best) | 2,589,295 | 1,830,866 | 2,072,131 | 3,119,879 | 3,140,786 | 2,473,921 | 2,379,015 | 779,417 | 8cpu L212–220 |
| Loop10, 100K workers, 1M producers, 8 CPUs | 5,040,936 (best) | 2,505,392 | 1,257,497 | 1,406,473 | 3,846,960 | 2,014,759 | 1,925,627 | 1,909,667 | 284,459 | 8cpu L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer, 8 CPUs | 3,734,297 (best) | 2,077,719 | 679,474 | 1,589,036 | 2,883,425 | 1,921,903 | 2,052,352 | 1,916,682 | 730,519 | 8cpu L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers, 8 CPUs | 4,111,318 (best) | 2,482,053 | 1,532,271 | 1,642,233 | 2,685,430 | 1,829,144 | 1,801,063 | 2,497,989 | 778,669 | 8cpu L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers, 8 CPUs | 4,163,080 (best) | 2,373,647 | 1,716,568 | 1,634,549 | 2,682,940 | 1,680,077 | 1,870,507 | 2,661,241 | 753,595 | 8cpu L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers, 8 CPUs | 3,983,207 (best) | 2,149,628 | 1,530,045 | 1,438,901 | 2,702,715 | 1,612,935 | 1,919,240 | 2,789,687 | 684,114 | 8cpu L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers, 8 CPUs | 2,757,349 | 1,805,562 | 1,225,296 | 1,382,658 | 2,879,461 (best) | 1,545,701 | 1,560,507 | 1,560,923 | 630,118 | 8cpu L266–274 |
| Sleep10ms, 300K workers, 1 producer, 8 CPUs | 2,455,963 | 2,093,774 | 576,738 | 1,213,314 | 2,784,449 (best) | 1,855,333 | 1,547,576 | 1,621,264 | 722,264 | 8cpu L275–283 |
| Sleep10ms, 300K workers, 100 producers, 8 CPUs | 2,719,832 (best) | 2,306,727 | 1,484,983 | 1,251,695 | 2,617,496 | 1,759,026 | 1,476,386 | 1,688,833 | 942,273 | 8cpu L284–292 |
| Sleep10ms, 300K workers, 1K producers, 8 CPUs | 2,726,497 (best) | 2,213,675 | 1,633,217 | 1,302,743 | 2,680,243 | 1,628,227 | 1,468,225 | 1,746,018 | 709,496 | 8cpu L293–301 |
| Sleep10ms, 300K workers, 10K producers, 8 CPUs | 2,766,179 | 2,002,153 | 1,477,399 | 1,318,660 | 2,815,102 (best) | 1,632,026 | 1,519,349 | 1,715,160 | 675,031 | 8cpu L302–310 |
| Sleep10ms, 300K workers, 1M producers, 8 CPUs | 2,660,367 | 1,747,875 | 1,173,250 | 1,153,433 | 2,669,081 (best) | 748,295 | 1,326,906 | 1,325,233 | 320,406 | 8cpu L311–319 |
| Loop10, 300K workers, 1 producer, 8 CPUs | 7,731,116 (best) | 3,256,171 | 1,115,385 | 1,383,162 | 3,147,900 | 2,043,314 | 1,752,500 | 2,041,223 | 885,063 | 8cpu L320–328 |
| Loop10, 300K workers, 100 producers, 8 CPUs | 9,990,429 (best) | 2,788,718 | 2,115,681 | 1,566,953 | 2,884,260 | 2,312,304 | 1,802,248 | 1,927,430 | 815,860 | 8cpu L329–337 |
| Loop10, 300K workers, 1K producers, 8 CPUs | 9,748,598 (best) | 2,723,620 | 2,071,194 | 1,612,649 | 2,961,010 | 3,133,647 | 1,722,204 | 1,898,363 | 938,049 | 8cpu L338–346 |
| Loop10, 300K workers, 10K producers, 8 CPUs | 9,514,309 (best) | 2,597,026 | 1,988,261 | 1,593,171 | 3,787,789 | 3,325,401 | 1,565,705 | 1,829,661 | 547,704 | 8cpu L347–355 |
| Loop10, 300K workers, 1M producers, 8 CPUs | 5,112,507 (best) | 2,515,607 | 1,297,076 | 1,326,960 | 3,819,515 | 2,005,256 | 1,572,745 | 1,643,865 | 183,942 | 8cpu L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer, 8 CPUs | 2,459,278 | 2,248,233 | 882,246 | 1,211,796 | 2,997,183 (best) | 1,896,457 | 1,575,617 | 1,717,074 | 763,774 | 8cpu L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers, 8 CPUs | 2,742,270 (best) | 2,438,900 | 1,539,005 | 1,261,448 | 2,634,212 | 1,799,708 | 1,481,643 | 1,777,802 | 802,117 | 8cpu L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers, 8 CPUs | 2,804,855 (best) | 2,384,087 | 1,682,370 | 1,293,508 | 2,709,618 | 1,660,992 | 1,507,317 | 1,703,386 | 769,307 | 8cpu L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers, 8 CPUs | 2,989,275 (best) | 2,164,418 | 1,508,185 | 1,320,203 | 2,773,516 | 1,647,167 | 1,517,762 | 1,799,994 | 673,978 | 8cpu L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers, 8 CPUs | 2,482,123 | 1,834,465 | 1,222,747 | 1,214,876 | 3,068,841 (best) | 1,070,799 | 1,357,213 | 1,351,918 | 357,014 | 8cpu L401–409 |
| Loop10, 1 worker, 1 producer, 8 CPUs | 6,326,035 | 1,708,634 | 1,477,781 | 4,029,748 | 2,505,977 | 11,383,821 | 3,830,596 | 26,148,651 (best) | 2,783,170 | 8cpu L410–418 |
| Loop10, 1 worker, 100 producers, 8 CPUs | 7,090,918 | 1,829,284 | 1,257,569 | 2,485,982 | 983,882 | 4,734,976 | 2,661,374 | 27,854,937 (best) | 1,580,776 | 8cpu L419–427 |
| Loop10, 1 worker, 1K producers, 8 CPUs | 7,190,233 | 1,164,781 | 950,948 | 1,991,543 | 1,976,966 | 4,724,164 | 3,535,456 | 26,084,154 (best) | 1,564,245 | 8cpu L428–436 |
| Loop10, 1 worker, 10K producers, 8 CPUs | 7,177,970 | 1,587,642 | 1,608,207 | 1,347,437 | 826,160 | 4,376,133 | 2,947,091 | 24,737,062 (best) | 1,568,077 | 8cpu L437–445 |
| Loop10, 1 worker, 1M producers, 8 CPUs | 5,181,886 | 802,451 | 1,151,548 | 1,323,368 | 1,266,037 | 3,965,171 | 2,352,358 | 5,320,750 (best) | 1,283,997 | 8cpu L446–454 |
| Loop10K, 1 worker, 1 producer, 8 CPUs | 322,978 | 262,550 | 150,606 | 206,440 | 264,605 | 336,341 | 220,928 | 337,903 (best) | 299,628 | 8cpu L455–463 |
| Loop10K, 1 worker, 100 producers, 8 CPUs | 326,262 | 263,467 | 173,781 | 307,338 | 268,565 | 314,035 | 320,871 | 334,568 (best) | 278,476 | 8cpu L464–472 |
| Loop10K, 1 worker, 1K producers, 8 CPUs | 325,224 | 263,508 | 152,058 | 302,173 | 262,424 | 316,598 | 321,028 | 336,500 (best) | 277,681 | 8cpu L473–481 |
| Loop10K, 1 worker, 10K producers, 8 CPUs | 325,199 | 256,045 | 202,793 | 296,590 | 255,972 | 318,011 | 313,400 | 337,132 (best) | 271,426 | 8cpu L482–490 |
| Loop10K, 1 worker, 1M producers, 8 CPUs | 324,508 | 268,194 | 192,389 | 284,650 | 241,213 | 322,427 | 295,566 | 328,842 (best) | 260,446 | 8cpu L491–499 |
| Sleep10ms, 50K workers, 1 producer, 4 CPUs | 2,504,306 | 1,913,216 | 1,183,121 | 1,883,293 | 2,253,850 | 2,215,600 | 2,024,379 | 3,736,757 (best) | 623,183 | 4cpu L5–13 |
| Sleep10ms, 50K workers, 100 producers, 4 CPUs | 2,554,864 | 2,177,404 | 1,619,490 | 1,725,821 | 2,110,137 | 2,021,565 | 1,921,155 | 3,673,447 (best) | 654,648 | 4cpu L14–22 |
| Sleep10ms, 50K workers, 1K producers, 4 CPUs | 2,481,416 | 2,237,604 | 1,591,348 | 1,644,058 | 2,066,129 | 1,712,781 | 1,915,121 | 3,674,940 (best) | 664,580 | 4cpu L23–31 |
| Sleep10ms, 50K workers, 10K producers, 4 CPUs | 2,491,621 | 1,920,782 | 1,452,288 | 1,454,461 | 1,913,117 | 2,175,690 | 2,113,921 | 3,662,015 (best) | 750,254 | 4cpu L32–40 |
| Sleep10ms, 50K workers, 1M producers, 4 CPUs | 1,436,960 | 1,517,066 | 1,042,072 | 1,398,267 | 1,968,705 (best) | 1,883,409 | 1,510,171 | 1,544,148 | 653,792 | 4cpu L41–49 |
| Loop10, 50K workers, 1 producer, 4 CPUs | 8,974,684 (best) | 3,663,215 | 1,557,553 | 2,427,842 | 3,588,268 | 2,604,365 | 2,880,121 | 2,932,268 | 854,865 | 4cpu L50–58 |
| Loop10, 50K workers, 100 producers, 4 CPUs | 9,414,707 (best) | 2,909,906 | 2,280,660 | 2,440,272 | 2,610,244 | 2,293,829 | 2,663,600 | 4,692,294 | 882,400 | 4cpu L59–67 |
| Loop10, 50K workers, 1K producers, 4 CPUs | 9,242,992 (best) | 2,884,879 | 2,111,816 | 2,562,457 | 2,723,893 | 2,553,615 | 2,954,328 | 3,428,164 | 821,661 | 4cpu L68–76 |
| Loop10, 50K workers, 10K producers, 4 CPUs | 9,100,058 (best) | 2,713,562 | 1,927,611 | 2,772,204 | 3,016,296 | 2,652,457 | 3,405,348 | 3,249,114 | 766,849 | 4cpu L77–85 |
| Loop10, 50K workers, 1M producers, 4 CPUs | 4,078,666 (best) | 2,728,615 | 1,365,879 | 1,726,126 | 3,757,427 | 2,399,119 | 2,076,888 | 2,168,784 | 707,310 | 4cpu L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer, 4 CPUs | 2,683,120 (best) | 2,188,831 | 1,397,144 | 1,827,467 | 2,548,192 | 2,230,850 | 1,993,757 | 2,020,323 | 703,813 | 4cpu L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers, 4 CPUs | 2,873,030 | 2,365,318 | 1,601,606 | 1,628,028 | 2,082,071 | 1,916,477 | 1,803,299 | 3,332,321 (best) | 724,189 | 4cpu L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers, 4 CPUs | 2,860,632 | 2,316,929 | 1,595,246 | 1,677,868 | 2,129,081 | 1,529,943 | 1,871,692 | 3,101,827 (best) | 750,682 | 4cpu L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers, 4 CPUs | 2,771,238 | 1,979,868 | 1,393,430 | 1,437,549 | 2,034,452 | 2,113,058 | 2,032,782 | 3,185,706 (best) | 792,167 | 4cpu L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers, 4 CPUs | 1,499,597 | 1,631,679 | 1,029,438 | 1,386,109 | 2,047,829 (best) | 1,957,175 | 1,543,432 | 1,542,083 | 649,209 | 4cpu L131–139 |
| Sleep10ms, 100K workers, 1 producer, 4 CPUs | 2,277,277 | 1,929,536 | 1,344,598 | 1,635,295 | 2,326,813 (best) | 2,213,291 | 1,752,724 | 1,778,211 | 621,073 | 4cpu L140–148 |
| Sleep10ms, 100K workers, 100 producers, 4 CPUs | 2,423,256 | 2,235,957 | 1,544,855 | 1,439,483 | 1,902,991 | 2,016,200 | 1,538,496 | 2,572,532 (best) | 676,464 | 4cpu L149–157 |
| Sleep10ms, 100K workers, 1K producers, 4 CPUs | 2,464,268 | 2,161,787 | 1,573,492 | 1,526,274 | 1,990,995 | 1,593,568 | 1,629,140 | 2,526,768 (best) | 667,401 | 4cpu L158–166 |
| Sleep10ms, 100K workers, 10K producers, 4 CPUs | 2,423,984 | 1,901,625 | 1,393,122 | 1,427,641 | 2,150,416 | 1,599,449 | 1,757,459 | 2,439,078 (best) | 813,016 | 4cpu L167–175 |
| Sleep10ms, 100K workers, 1M producers, 4 CPUs | 1,373,342 | 1,482,758 | 1,004,084 | 1,289,624 | 1,967,247 (best) | 1,870,184 | 1,414,272 | 1,411,968 | 591,249 | 4cpu L176–184 |
| Loop10, 100K workers, 1 producer, 4 CPUs | 8,822,850 (best) | 3,695,054 | 999,547 | 2,203,406 | 3,614,516 | 2,526,563 | 2,594,506 | 2,748,426 | 887,493 | 4cpu L185–193 |
| Loop10, 100K workers, 100 producers, 4 CPUs | 9,073,531 (best) | 2,850,110 | 2,254,006 | 2,176,856 | 2,595,711 | 2,334,207 | 2,352,562 | 2,934,572 | 889,293 | 4cpu L194–202 |
| Loop10, 100K workers, 1K producers, 4 CPUs | 8,963,968 (best) | 2,823,795 | 2,092,593 | 2,162,966 | 2,860,459 | 2,605,763 | 2,411,816 | 2,778,263 | 819,885 | 4cpu L203–211 |
| Loop10, 100K workers, 10K producers, 4 CPUs | 8,741,077 (best) | 2,712,149 | 1,878,664 | 2,321,116 | 3,242,404 | 2,619,015 | 2,967,802 | 2,785,151 | 769,006 | 4cpu L212–220 |
| Loop10, 100K workers, 1M producers, 4 CPUs | 4,085,856 (best) | 2,712,580 | 1,367,833 | 1,491,690 | 3,796,375 | 2,379,867 | 1,962,092 | 2,047,578 | 445,405 | 4cpu L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer, 4 CPUs | 2,588,982 (best) | 2,177,372 | 1,266,818 | 1,678,743 | 2,534,752 | 2,282,109 | 1,830,325 | 1,874,953 | 713,349 | 4cpu L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers, 4 CPUs | 2,675,082 (best) | 2,369,545 | 1,615,656 | 1,476,984 | 1,919,244 | 1,911,984 | 1,558,296 | 2,363,042 | 731,775 | 4cpu L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers, 4 CPUs | 2,685,087 | 2,325,682 | 1,589,778 | 1,586,390 | 2,003,671 | 1,785,487 | 1,631,038 | 2,737,841 (best) | 698,138 | 4cpu L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers, 4 CPUs | 2,612,762 (best) | 1,962,630 | 1,441,348 | 1,462,821 | 2,156,860 | 1,675,246 | 1,804,550 | 2,345,062 | 842,579 | 4cpu L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers, 4 CPUs | 1,491,073 | 1,672,673 | 1,036,474 | 1,342,939 | 2,040,959 (best) | 1,947,089 | 1,410,187 | 1,459,386 | 578,672 | 4cpu L266–274 |
| Sleep10ms, 300K workers, 1 producer, 4 CPUs | 1,972,243 | 1,895,103 | 1,400,181 | 1,259,592 | 2,282,556 (best) | 2,114,410 | 1,449,094 | 1,528,653 | 619,592 | 4cpu L275–283 |
| Sleep10ms, 300K workers, 100 producers, 4 CPUs | 1,900,906 | 2,132,405 (best) | 1,549,604 | 1,165,948 | 1,843,322 | 1,816,248 | 1,295,588 | 2,019,173 | 681,027 | 4cpu L284–292 |
| Sleep10ms, 300K workers, 1K producers, 4 CPUs | 2,070,837 | 2,212,462 (best) | 1,531,333 | 1,222,419 | 1,940,576 | 1,344,606 | 1,309,023 | 1,682,078 | 728,195 | 4cpu L293–301 |
| Sleep10ms, 300K workers, 10K producers, 4 CPUs | 2,108,599 | 1,899,876 | 1,378,367 | 1,262,676 | 2,115,244 (best) | 1,526,651 | 1,455,983 | 1,683,873 | 609,106 | 4cpu L302–310 |
| Sleep10ms, 300K workers, 1M producers, 4 CPUs | 1,392,523 | 1,483,417 | 1,017,560 | 1,082,728 | 1,951,801 (best) | 1,875,449 | 1,210,427 | 1,254,215 | 400,028 | 4cpu L311–319 |
| Loop10, 300K workers, 1 producer, 4 CPUs | 8,904,451 (best) | 3,691,593 | 876,263 | 1,587,828 | 3,559,990 | 2,486,249 | 2,030,857 | 2,167,295 | 880,499 | 4cpu L320–328 |
| Loop10, 300K workers, 100 producers, 4 CPUs | 9,540,875 (best) | 2,884,675 | 2,303,545 | 1,512,610 | 2,725,520 | 2,314,553 | 1,763,438 | 2,057,987 | 877,699 | 4cpu L329–337 |
| Loop10, 300K workers, 1K producers, 4 CPUs | 8,864,308 (best) | 2,880,763 | 2,139,906 | 1,525,242 | 2,817,087 | 2,411,791 | 1,891,427 | 1,864,496 | 821,228 | 4cpu L338–346 |
| Loop10, 300K workers, 10K producers, 4 CPUs | 8,823,550 (best) | 2,649,041 | 1,937,796 | 1,600,822 | 3,558,489 | 2,536,054 | 1,900,095 | 1,914,892 | 772,312 | 4cpu L347–355 |
| Loop10, 300K workers, 1M producers, 4 CPUs | 4,006,494 (best) | 2,774,204 | 1,380,812 | 1,501,498 | 3,906,769 | 2,394,671 | 1,659,267 | 1,691,046 | 404,836 | 4cpu L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer, 4 CPUs | 2,180,862 | 2,158,372 | 1,469,828 | 1,300,435 | 2,540,219 (best) | 2,267,699 | 1,485,305 | 1,568,345 | 697,295 | 4cpu L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers, 4 CPUs | 2,261,985 | 2,276,359 (best) | 1,601,331 | 1,169,340 | 1,899,621 | 1,968,919 | 1,286,994 | 1,614,006 | 727,407 | 4cpu L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers, 4 CPUs | 2,136,678 | 2,338,347 (best) | 1,562,446 | 1,195,559 | 1,985,445 | 1,721,649 | 1,337,528 | 1,588,406 | 700,550 | 4cpu L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers, 4 CPUs | 2,220,232 | 1,939,939 | 1,425,925 | 1,234,456 | 2,226,923 (best) | 1,448,610 | 1,441,574 | 1,684,125 | 637,865 | 4cpu L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers, 4 CPUs | 1,521,728 | 1,645,270 | 1,037,657 | 1,156,707 | 2,107,373 (best) | 1,896,843 | 1,204,219 | 1,270,588 | 372,732 | 4cpu L401–409 |
| Loop10, 1 worker, 1 producer, 4 CPUs | 6,632,332 | 1,242,226 | 1,769,691 | 2,090,601 | 1,341,601 | 11,813,021 | 3,692,385 | 26,202,379 (best) | 2,773,548 | 4cpu L410–418 |
| Loop10, 1 worker, 100 producers, 4 CPUs | 7,308,651 | 1,696,633 | 1,712,354 | 3,028,265 | 2,482,547 | 4,781,570 | 5,785,343 | 27,380,238 (best) | 1,733,181 | 4cpu L419–427 |
| Loop10, 1 worker, 1K producers, 4 CPUs | 7,342,679 | 1,461,392 | 1,494,450 | 2,709,995 | 2,371,571 | 4,789,004 | 3,910,772 | 26,829,003 (best) | 1,686,809 | 4cpu L428–436 |
| Loop10, 1 worker, 10K producers, 4 CPUs | 7,271,060 | 1,402,085 | 1,337,644 | 2,115,881 | 1,302,625 | 4,927,431 | 3,558,888 | 23,643,298 (best) | 1,705,779 | 4cpu L437–445 |
| Loop10, 1 worker, 1M producers, 4 CPUs | 4,304,050 | 895,593 | 1,349,366 | 1,352,913 | 1,366,016 | 3,808,882 | 2,519,020 | 4,798,241 (best) | 1,530,277 | 4cpu L446–454 |
| Loop10K, 1 worker, 1 producer, 4 CPUs | 324,401 | 262,078 | 179,912 | 217,314 | 268,953 | 330,298 | 205,916 | 333,826 (best) | 300,071 | 4cpu L455–463 |
| Loop10K, 1 worker, 100 producers, 4 CPUs | 324,909 | 265,614 | 186,457 | 317,155 | 262,930 | 318,468 | 322,479 | 332,585 (best) | 282,164 | 4cpu L464–472 |
| Loop10K, 1 worker, 1K producers, 4 CPUs | 325,729 | 263,156 | 161,846 | 313,304 | 264,692 | 310,645 | 321,535 | 334,843 (best) | 280,022 | 4cpu L473–481 |
| Loop10K, 1 worker, 10K producers, 4 CPUs | 325,666 | 253,377 | 228,233 | 305,421 | 252,112 | 312,945 | 311,607 | 333,216 (best) | 280,109 | 4cpu L482–490 |
| Loop10K, 1 worker, 1M producers, 4 CPUs | 325,027 | 261,287 | 186,733 | 283,844 | 250,315 | 329,648 | 304,900 | 333,400 (best) | 282,891 | 4cpu L491–499 |
Run detailsgo test command, machine, versions
cd pool && go test -run xxx -bench 'Tasks' -cpu 24,8,4 -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
| Library | Version |
|---|---|
| varmq | v1.10.0 |
| ants | v2.12.1 |
| workerpool | v1.2.2 |
| conc | v0.3.0 |
| x/sync (errgroup) | v0.24.0 |
| bytedance/gopkg (gopool) | v0.1.4 |
| pond | v2.7.2 |
Worker pool, GOMAXPROCS 24
Nine pools, 1M tasks per run.
55 groups in scope · VarMQ leads 39, others 16 · 9 subjects
Tasks per second
tasks/s · higher is better · mean of 55 groups- VarMQwon 39 of 55 4,719,281 1.00 times VarMQ, the baseline
- BufferedPool †won 12 of 55 3,158,583 0.67 times VarMQ, behind VarMQ
- Antswon 0 of 55 1,744,569 0.37 times VarMQ, behind VarMQ
- ErrGroupwon 3 of 55 1,698,742 0.36 times VarMQ, behind VarMQ
- Gopoolwon 1 of 55 1,610,290 0.34 times VarMQ, behind VarMQ
- GoroutinePool †won 0 of 55 1,093,148 0.23 times VarMQ, behind VarMQ
- WorkerPoolwon 0 of 55 946,147 0.20 times VarMQ, behind VarMQ
- Concwon 0 of 55 883,068 0.19 times VarMQ, behind VarMQ
- Pondwon 0 of 55 439,778 0.09 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
† A baseline, not a library: N goroutines reading one channel. The buffered one holds all 1M tasks.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| Task · workers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers |
|---|---|---|---|---|---|
| Sleep10ms · 50K | |||||
| Loop10 · 50K | |||||
| Sleep5msLoop5 · 50K | |||||
| Sleep10ms · 100K | |||||
| Loop10 · 100K | |||||
| Sleep5msLoop5 · 100K | |||||
| Sleep10ms · 300K | |||||
| Loop10 · 300K | |||||
| Sleep5msLoop5 · 300K | |||||
| Loop10 · 1 worker | |||||
| Loop10K · 1 worker |
- VQVarMQ39
- BPBufferedPool †12
- EGErrGroup3
- GPGopool1
Where VarMQ does not win
Another subject has the fastest throughput in 16 groups of 55. VarMQ has it in 39.
- BufferedPool † 12 groups
- ErrGroup 3 groups
- Gopool 1 group
All 16 groups where VarMQ does not win, biggest gap first
| Group | Best | VarMQ | Ahead by | Source |
|---|---|---|---|---|
| Loop10, 1 worker, 1 producer | BufferedPool † 26,076,554 | 5,612,142 3 of 9 | 4.65× | L410–418 |
| Loop10, 1 worker, 1K producers | BufferedPool † 24,944,261 | 5,587,181 2 of 9 | 4.46× | L428–436 |
| Loop10, 1 worker, 100 producers | BufferedPool † 25,921,880 | 6,768,459 2 of 9 | 3.83× | L419–427 |
| Loop10, 1 worker, 10K producers | BufferedPool † 21,230,114 | 6,584,676 2 of 9 | 3.22× | L437–445 |
| Loop10, 1 worker, 1M producers | BufferedPool † 4,756,005 | 4,048,978 2 of 9 | 1.17× | L446–454 |
| Sleep10ms, 50K workers, 10K producers | BufferedPool † 2,962,595 | 2,632,451 2 of 9 | 1.13× | L32–40 |
| Sleep5msLoop5, 300K workers, 1 producer | ErrGroup 2,543,927 | 2,275,746 2 of 9 | 1.12× | L365–373 |
| Sleep10ms, 300K workers, 1M producers | ErrGroup 2,161,621 | 1,937,685 2 of 9 | 1.12× | L311–319 |
| Sleep10ms, 50K workers, 100 producers | BufferedPool † 3,011,339 | 2,771,948 2 of 9 | 1.09× | L14–22 |
| Sleep10ms, 300K workers, 1 producer | ErrGroup 2,293,517 | 2,135,964 2 of 9 | 1.07× | L275–283 |
| Sleep10ms, 50K workers, 1K producers | BufferedPool † 2,915,777 | 2,741,551 2 of 9 | 1.06× | L23–31 |
| Loop10K, 1 worker, 100 producers | BufferedPool † 334,515 | 322,322 3 of 9 | 1.04× | L464–472 |
| Loop10K, 1 worker, 1 producer | Gopool 336,425 | 324,485 3 of 9 | 1.04× | L455–463 |
| Loop10K, 1 worker, 1K producers | BufferedPool † 333,606 | 322,936 2 of 9 | 1.03× | L473–481 |
| Loop10K, 1 worker, 1M producers | BufferedPool † 322,314 | 312,975 2 of 9 | 1.03× | L491–499 |
| Loop10K, 1 worker, 10K producers | BufferedPool † 333,318 | 323,713 2 of 9 | 1.03× | L482–490 |
Every row behind these numbers · 55 groups
| Group | VarMQ | Ants | WorkerPool | Conc | ErrGroup | Gopool | GoroutinePool † | BufferedPool † | Pond | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| Sleep10ms, 50K workers, 1 producer | 2,912,550 (best) | 1,519,070 | 656,765 | 1,429,409 | 1,794,858 | 954,564 | 1,339,549 | 1,537,452 | 399,351 | L5–13 |
| Sleep10ms, 50K workers, 100 producers | 2,771,948 | 2,035,061 | 1,015,615 | 1,619,384 | 1,582,002 | 1,361,653 | 1,017,638 | 3,011,339 (best) | 368,806 | L14–22 |
| Sleep10ms, 50K workers, 1K producers | 2,741,551 | 2,077,158 | 1,156,901 | 586,431 | 1,464,832 | 1,141,372 | 778,011 | 2,915,777 (best) | 284,263 | L23–31 |
| Sleep10ms, 50K workers, 10K producers | 2,632,451 | 1,884,900 | 973,489 | 497,178 | 1,268,658 | 1,189,586 | 1,137,502 | 2,962,595 (best) | 415,109 | L32–40 |
| Sleep10ms, 50K workers, 1M producers | 2,553,298 (best) | 1,382,534 | 864,947 | 1,251,845 | 1,758,812 | 1,403,797 | 1,319,959 | 1,261,415 | 410,218 | L41–49 |
| Loop10, 50K workers, 1 producer | 7,391,698 (best) | 1,990,627 | 1,811,122 | 1,293,970 | 2,330,329 | 1,342,225 | 1,604,738 | 1,567,348 | 305,817 | L50–58 |
| Loop10, 50K workers, 100 producers | 11,460,237 (best) | 2,480,988 | 880,365 | 1,231,462 | 1,588,223 | 2,005,832 | 1,144,077 | 1,069,505 | 324,663 | L59–67 |
| Loop10, 50K workers, 1K producers | 11,943,831 (best) | 2,462,577 | 1,399,805 | 718,067 | 1,131,098 | 2,423,449 | 2,319,056 | 2,108,059 | 627,675 | L68–76 |
| Loop10, 50K workers, 10K producers | 11,123,489 (best) | 2,097,792 | 1,587,189 | 716,207 | 1,802,430 | 2,256,852 | 1,073,129 | 1,048,061 | 422,508 | L77–85 |
| Loop10, 50K workers, 1M producers | 3,701,745 (best) | 2,066,346 | 886,019 | 1,351,280 | 2,693,246 | 1,992,786 | 1,795,731 | 1,804,391 | 274,306 | L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer | 3,702,257 (best) | 1,481,031 | 414,158 | 1,313,209 | 2,244,662 | 941,503 | 885,899 | 1,268,019 | 284,774 | L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers | 4,141,394 (best) | 2,216,414 | 671,836 | 829,635 | 1,698,787 | 1,540,400 | 1,748,018 | 3,077,938 | 381,410 | L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers | 4,081,581 (best) | 2,186,966 | 1,192,459 | 536,919 | 1,608,759 | 1,453,572 | 747,096 | 3,133,797 | 266,469 | L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers | 3,884,958 (best) | 1,925,470 | 1,078,418 | 539,814 | 1,550,695 | 1,387,420 | 949,423 | 2,806,689 | 415,162 | L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers | 3,013,711 (best) | 1,354,235 | 964,243 | 1,324,931 | 1,204,768 | 935,379 | 1,452,245 | 1,445,972 | 392,536 | L131–139 |
| Sleep10ms, 100K workers, 1 producer | 3,186,940 (best) | 1,232,040 | 464,330 | 1,023,228 | 2,244,373 | 1,306,482 | 1,415,210 | 1,329,567 | 433,481 | L140–148 |
| Sleep10ms, 100K workers, 100 producers | 3,099,420 (best) | 2,128,994 | 640,768 | 629,472 | 1,410,503 | 1,520,710 | 748,027 | 1,235,336 | 365,591 | L149–157 |
| Sleep10ms, 100K workers, 1K producers | 3,070,265 (best) | 2,127,243 | 1,208,889 | 884,789 | 1,568,382 | 1,510,232 | 873,092 | 1,788,000 | 282,140 | L158–166 |
| Sleep10ms, 100K workers, 10K producers | 3,106,371 (best) | 1,916,333 | 1,113,100 | 447,415 | 1,147,200 | 1,281,530 | 864,372 | 2,300,995 | 258,489 | L167–175 |
| Sleep10ms, 100K workers, 1M producers | 2,590,761 (best) | 1,258,017 | 938,921 | 1,241,020 | 1,822,877 | 983,668 | 1,251,392 | 1,313,986 | 413,874 | L176–184 |
| Loop10, 100K workers, 1 producer | 7,655,402 (best) | 1,797,014 | 1,780,325 | 871,350 | 2,452,591 | 650,795 | 881,705 | 1,143,310 | 258,078 | L185–193 |
| Loop10, 100K workers, 100 producers | 12,148,546 (best) | 2,491,122 | 885,864 | 622,712 | 2,484,519 | 1,798,938 | 748,174 | 715,315 | 303,219 | L194–202 |
| Loop10, 100K workers, 1K producers | 12,226,055 (best) | 2,448,765 | 1,587,293 | 698,892 | 1,221,789 | 2,527,880 | 841,209 | 745,780 | 302,656 | L203–211 |
| Loop10, 100K workers, 10K producers | 10,991,630 (best) | 2,327,981 | 1,429,656 | 763,993 | 2,076,663 | 1,501,982 | 1,228,318 | 940,196 | 359,744 | L212–220 |
| Loop10, 100K workers, 1M producers | 4,945,904 (best) | 1,972,167 | 900,888 | 1,471,112 | 2,688,984 | 1,864,032 | 1,694,485 | 1,713,957 | 195,794 | L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer | 3,637,486 (best) | 1,447,185 | 546,915 | 1,295,835 | 2,216,760 | 918,703 | 1,049,195 | 955,075 | 245,538 | L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers | 4,388,983 (best) | 2,254,168 | 667,374 | 732,438 | 1,975,484 | 1,396,246 | 1,435,188 | 1,681,656 | 406,611 | L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers | 4,142,646 (best) | 2,209,361 | 1,200,520 | 681,386 | 1,505,560 | 1,461,071 | 994,664 | 1,964,340 | 287,311 | L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers | 4,321,934 (best) | 1,998,802 | 1,095,639 | 432,165 | 1,843,065 | 1,522,098 | 892,702 | 2,146,119 | 350,291 | L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers | 2,441,000 (best) | 1,389,629 | 974,400 | 1,240,756 | 2,252,720 | 1,114,660 | 1,309,237 | 1,300,391 | 356,724 | L266–274 |
| Sleep10ms, 300K workers, 1 producer | 2,135,964 | 1,423,911 | 674,477 | 905,784 | 2,293,517 (best) | 1,158,774 | 1,164,541 | 1,279,765 | 404,293 | L275–283 |
| Sleep10ms, 300K workers, 100 producers | 2,641,759 (best) | 2,103,215 | 730,914 | 943,261 | 1,168,031 | 1,139,678 | 778,535 | 711,112 | 410,141 | L284–292 |
| Sleep10ms, 300K workers, 1K producers | 2,672,786 (best) | 2,092,344 | 1,242,138 | 1,149,947 | 1,517,095 | 1,482,393 | 709,468 | 1,087,562 | 283,971 | L293–301 |
| Sleep10ms, 300K workers, 10K producers | 2,581,158 (best) | 1,836,557 | 1,139,974 | 597,356 | 1,487,572 | 1,353,100 | 695,951 | 883,328 | 292,336 | L302–310 |
| Sleep10ms, 300K workers, 1M producers | 1,937,685 | 1,273,929 | 919,127 | 978,159 | 2,161,621 (best) | 659,276 | 1,147,985 | 1,127,933 | 300,361 | L311–319 |
| Loop10, 300K workers, 1 producer | 7,061,717 (best) | 1,926,912 | 1,151,327 | 730,006 | 2,332,201 | 774,258 | 996,672 | 1,000,133 | 344,545 | L320–328 |
| Loop10, 300K workers, 100 producers | 11,120,957 (best) | 2,468,320 | 989,128 | 568,315 | 2,783,019 | 2,042,220 | 821,431 | 786,589 | 590,471 | L329–337 |
| Loop10, 300K workers, 1K producers | 11,837,012 (best) | 2,419,535 | 1,739,799 | 778,083 | 2,158,559 | 2,376,341 | 801,351 | 1,334,788 | 425,958 | L338–346 |
| Loop10, 300K workers, 10K producers | 10,647,574 (best) | 2,217,089 | 1,471,641 | 831,012 | 3,177,492 | 2,714,958 | 1,130,040 | 945,233 | 324,284 | L347–355 |
| Loop10, 300K workers, 1M producers | 4,838,041 (best) | 1,989,109 | 885,105 | 1,061,057 | 3,048,488 | 1,944,313 | 1,308,876 | 1,444,907 | 179,640 | L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer | 2,275,746 | 1,519,060 | 538,180 | 930,919 | 2,543,927 (best) | 1,160,267 | 1,017,716 | 1,242,966 | 279,136 | L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers | 2,702,395 (best) | 2,213,105 | 730,379 | 1,078,856 | 1,781,723 | 1,653,042 | 1,001,925 | 1,237,635 | 325,528 | L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers | 2,617,388 (best) | 2,206,429 | 1,260,367 | 1,027,524 | 1,329,192 | 1,254,891 | 702,793 | 1,137,222 | 382,119 | L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers | 2,471,812 (best) | 1,951,986 | 1,157,052 | 582,503 | 1,349,137 | 1,408,464 | 932,752 | 1,395,710 | 508,267 | L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers | 1,800,531 (best) | 1,402,851 | 979,629 | 997,380 | 1,169,486 | 634,759 | 1,221,871 | 1,226,829 | 217,506 | L401–409 |
| Loop10, 1 worker, 1 producer | 5,612,142 | 1,582,899 | 1,473,002 | 3,423,771 | 1,487,417 | 8,177,809 | 3,920,683 | 26,076,554 (best) | 3,028,169 | L410–418 |
| Loop10, 1 worker, 100 producers | 6,768,459 | 2,076,506 | 543,788 | 463,815 | 1,313,642 | 4,157,265 | 816,034 | 25,921,880 (best) | 1,041,918 | L419–427 |
| Loop10, 1 worker, 1K producers | 5,587,181 | 1,470,470 | 729,037 | 504,896 | 1,116,652 | 2,782,257 | 1,000,047 | 24,944,261 (best) | 870,740 | L428–436 |
| Loop10, 1 worker, 10K producers | 6,584,676 | 1,516,219 | 709,503 | 625,526 | 2,124,776 | 3,713,812 | 1,020,295 | 21,230,114 (best) | 1,185,321 | L437–445 |
| Loop10, 1 worker, 1M producers | 4,048,978 | 812,581 | 1,143,188 | 737,708 | 1,174,023 | 2,731,570 | 1,941,971 | 4,756,005 (best) | 1,109,138 | L446–454 |
| Loop10K, 1 worker, 1 producer | 324,485 | 265,060 | 170,583 | 182,923 | 264,163 | 336,425 (best) | 217,878 | 335,389 | 298,315 | L455–463 |
| Loop10K, 1 worker, 100 producers | 322,322 | 263,642 | 154,748 | 310,680 | 263,194 | 316,513 | 322,404 | 334,515 (best) | 245,228 | L464–472 |
| Loop10K, 1 worker, 1K producers | 322,936 | 263,783 | 153,473 | 306,176 | 262,053 | 309,949 | 318,883 | 333,606 (best) | 244,325 | L473–481 |
| Loop10K, 1 worker, 10K producers | 323,713 | 255,670 | 171,686 | 304,454 | 253,845 | 308,782 | 309,248 | 333,318 (best) | 247,535 | L482–490 |
| Loop10K, 1 worker, 1M producers | 312,975 | 240,117 | 191,623 | 272,352 | 236,378 | 285,413 | 284,754 | 322,314 (best) | 255,940 | L491–499 |
Run detailsgo test command, machine, versions
cd pool && go test -run xxx -bench 'Tasks' -cpu 24 -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
| Library | Version |
|---|---|
| varmq | v1.10.0 |
| ants | v2.12.1 |
| workerpool | v1.2.2 |
| conc | v0.3.0 |
| x/sync (errgroup) | v0.24.0 |
| bytedance/gopkg (gopool) | v0.1.4 |
| pond | v2.7.2 |
Worker pool, GOMAXPROCS 8
The same matrix with GOMAXPROCS 8.
55 groups in scope · VarMQ leads 33, others 22 · 9 subjects
Tasks per second
tasks/s · higher is better · mean of 55 groups- VarMQwon 33 of 55 4,683,021 1.00 times VarMQ, the baseline
- BufferedPool †won 14 of 55 3,983,311 0.85 times VarMQ, behind VarMQ
- ErrGroupwon 8 of 55 2,484,641 0.53 times VarMQ, behind VarMQ
- Gopoolwon 0 of 55 2,192,502 0.47 times VarMQ, behind VarMQ
- Antswon 0 of 55 2,081,951 0.44 times VarMQ, behind VarMQ
- GoroutinePool †won 0 of 55 1,873,143 0.40 times VarMQ, behind VarMQ
- Concwon 0 of 55 1,537,793 0.33 times VarMQ, behind VarMQ
- WorkerPoolwon 0 of 55 1,322,094 0.28 times VarMQ, behind VarMQ
- Pondwon 0 of 55 754,775 0.16 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
† A baseline, not a library: N goroutines reading one channel. The buffered one holds all 1M tasks.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| Task · workers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers |
|---|---|---|---|---|---|
| Sleep10ms · 50K | |||||
| Loop10 · 50K | |||||
| Sleep5msLoop5 · 50K | |||||
| Sleep10ms · 100K | |||||
| Loop10 · 100K | |||||
| Sleep5msLoop5 · 100K | |||||
| Sleep10ms · 300K | |||||
| Loop10 · 300K | |||||
| Sleep5msLoop5 · 300K | |||||
| Loop10 · 1 worker | |||||
| Loop10K · 1 worker |
- VQVarMQ33
- BPBufferedPool †14
- EGErrGroup8
Where VarMQ does not win
Another subject has the fastest throughput in 22 groups of 55. VarMQ has it in 33.
- BufferedPool † 14 groups
- ErrGroup 8 groups
All 22 groups where VarMQ does not win, biggest gap first
| Group | Best | VarMQ | Ahead by | Source |
|---|---|---|---|---|
| Loop10, 1 worker, 1 producer | BufferedPool † 26,148,651 | 6,326,035 3 of 9 | 4.13× | L410–418 |
| Loop10, 1 worker, 100 producers | BufferedPool † 27,854,937 | 7,090,918 2 of 9 | 3.93× | L419–427 |
| Loop10, 1 worker, 1K producers | BufferedPool † 26,084,154 | 7,190,233 2 of 9 | 3.63× | L428–436 |
| Loop10, 1 worker, 10K producers | BufferedPool † 24,737,062 | 7,177,970 2 of 9 | 3.45× | L437–445 |
| Sleep10ms, 50K workers, 1 producer | BufferedPool † 3,939,669 | 3,176,393 2 of 9 | 1.24× | L5–13 |
| Sleep5msLoop5, 300K workers, 1M producers | ErrGroup 3,068,841 | 2,482,123 2 of 9 | 1.24× | L401–409 |
| Sleep5msLoop5, 300K workers, 1 producer | ErrGroup 2,997,183 | 2,459,278 2 of 9 | 1.22× | L365–373 |
| Sleep10ms, 50K workers, 10K producers | BufferedPool † 3,731,132 | 3,169,295 2 of 9 | 1.18× | L32–40 |
| Sleep10ms, 50K workers, 100 producers | BufferedPool † 3,813,389 | 3,274,819 2 of 9 | 1.16× | L14–22 |
| Sleep10ms, 50K workers, 1K producers | BufferedPool † 3,800,703 | 3,266,799 2 of 9 | 1.16× | L23–31 |
| Sleep10ms, 300K workers, 1 producer | ErrGroup 2,784,449 | 2,455,963 2 of 9 | 1.13× | L275–283 |
| Loop10K, 1 worker, 1 producer | BufferedPool † 337,903 | 322,978 3 of 9 | 1.05× | L455–463 |
| Sleep5msLoop5, 100K workers, 1M producers | ErrGroup 2,879,461 | 2,757,349 2 of 9 | 1.04× | L266–274 |
| Sleep10ms, 50K workers, 1M producers | ErrGroup 2,732,450 | 2,628,276 2 of 9 | 1.04× | L41–49 |
| Loop10K, 1 worker, 10K producers | BufferedPool † 337,132 | 325,199 2 of 9 | 1.04× | L482–490 |
| Loop10K, 1 worker, 1K producers | BufferedPool † 336,500 | 325,224 2 of 9 | 1.03× | L473–481 |
| Loop10, 1 worker, 1M producers | BufferedPool † 5,320,750 | 5,181,886 2 of 9 | 1.03× | L446–454 |
| Loop10K, 1 worker, 100 producers | BufferedPool † 334,568 | 326,262 2 of 9 | 1.03× | L464–472 |
| Sleep10ms, 300K workers, 10K producers | ErrGroup 2,815,102 | 2,766,179 2 of 9 | 1.02× | L302–310 |
| Sleep10ms, 100K workers, 1M producers | ErrGroup 2,675,045 | 2,629,661 2 of 9 | 1.02× | L176–184 |
| Loop10K, 1 worker, 1M producers | BufferedPool † 328,842 | 324,508 2 of 9 | 1.01× | L491–499 |
| Sleep10ms, 300K workers, 1M producers | ErrGroup 2,669,081 | 2,660,367 2 of 9 | 1.00× | L311–319 |
Every row behind these numbers · 55 groups
| Group | VarMQ | Ants | WorkerPool | Conc | ErrGroup | Gopool | GoroutinePool † | BufferedPool † | Pond | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| Sleep10ms, 50K workers, 1 producer | 3,176,393 | 1,986,231 | 679,563 | 1,849,255 | 2,640,266 | 1,839,933 | 2,073,880 | 3,939,669 (best) | 704,764 | L5–13 |
| Sleep10ms, 50K workers, 100 producers | 3,274,819 | 2,327,861 | 1,569,760 | 1,833,619 | 2,447,916 | 1,738,482 | 2,131,513 | 3,813,389 (best) | 710,970 | L14–22 |
| Sleep10ms, 50K workers, 1K producers | 3,266,799 | 2,284,979 | 1,708,169 | 1,615,934 | 2,263,140 | 1,599,249 | 2,049,195 | 3,800,703 (best) | 716,863 | L23–31 |
| Sleep10ms, 50K workers, 10K producers | 3,169,295 | 2,112,959 | 1,537,853 | 1,402,121 | 1,838,928 | 2,264,740 | 2,099,609 | 3,731,132 (best) | 779,413 | L32–40 |
| Sleep10ms, 50K workers, 1M producers | 2,628,276 | 1,790,694 | 1,166,711 | 1,461,992 | 2,732,450 (best) | 1,655,538 | 1,659,281 | 1,665,211 | 677,640 | L41–49 |
| Loop10, 50K workers, 1 producer | 7,671,684 (best) | 3,311,130 | 1,291,498 | 2,191,790 | 3,266,709 | 2,139,690 | 2,738,622 | 2,895,918 | 891,515 | L50–58 |
| Loop10, 50K workers, 100 producers | 10,048,582 (best) | 2,785,465 | 2,048,257 | 2,441,882 | 2,636,984 | 2,339,683 | 2,786,947 | 4,043,435 | 804,596 | L59–67 |
| Loop10, 50K workers, 1K producers | 9,631,427 (best) | 2,710,156 | 2,114,193 | 2,422,538 | 2,616,806 | 3,319,312 | 2,997,697 | 2,965,094 | 556,446 | L68–76 |
| Loop10, 50K workers, 10K producers | 9,342,026 (best) | 2,559,600 | 1,957,654 | 1,820,891 | 3,112,282 | 3,348,069 | 3,124,697 | 2,298,151 | 625,787 | L77–85 |
| Loop10, 50K workers, 1M producers | 5,183,600 (best) | 2,493,160 | 1,327,188 | 1,774,230 | 3,814,425 | 2,028,430 | 2,026,601 | 2,047,610 | 385,713 | L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer | 4,080,137 (best) | 2,199,664 | 595,668 | 1,858,440 | 2,860,603 | 1,938,857 | 2,113,304 | 2,118,268 | 724,425 | L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers | 4,370,254 (best) | 2,458,764 | 1,545,827 | 1,829,243 | 2,783,624 | 1,759,654 | 2,030,108 | 3,658,544 | 765,675 | L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers | 4,342,675 (best) | 2,394,348 | 1,723,581 | 1,641,479 | 2,615,562 | 1,638,460 | 1,885,046 | 3,271,588 | 695,670 | L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers | 3,897,961 (best) | 2,176,721 | 1,489,095 | 1,308,161 | 2,147,916 | 2,323,846 | 2,083,902 | 3,830,494 | 836,893 | L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers | 3,066,865 (best) | 1,820,757 | 1,243,540 | 1,520,168 | 2,875,622 | 1,742,844 | 1,679,313 | 1,667,937 | 633,235 | L131–139 |
| Sleep10ms, 100K workers, 1 producer | 3,382,564 (best) | 2,031,611 | 797,093 | 1,684,581 | 2,771,764 | 1,886,008 | 1,961,994 | 1,985,532 | 688,822 | L140–148 |
| Sleep10ms, 100K workers, 100 producers | 3,495,042 (best) | 2,325,278 | 1,510,855 | 1,596,958 | 2,653,807 | 1,798,224 | 1,785,989 | 3,026,245 | 730,926 | L149–157 |
| Sleep10ms, 100K workers, 1K producers | 3,404,792 (best) | 2,298,816 | 1,611,359 | 1,619,952 | 2,655,545 | 1,609,919 | 1,809,348 | 2,940,701 | 868,513 | L158–166 |
| Sleep10ms, 100K workers, 10K producers | 3,307,640 (best) | 2,084,848 | 1,482,996 | 1,378,631 | 2,489,694 | 1,609,554 | 1,913,004 | 2,660,361 | 666,634 | L167–175 |
| Sleep10ms, 100K workers, 1M producers | 2,629,661 | 1,743,809 | 1,209,273 | 1,341,418 | 2,675,045 (best) | 1,496,747 | 1,527,097 | 1,492,396 | 588,528 | L176–184 |
| Loop10, 100K workers, 1 producer | 8,016,914 (best) | 3,318,506 | 915,582 | 1,962,675 | 3,223,144 | 2,125,860 | 2,315,982 | 2,467,976 | 879,748 | L185–193 |
| Loop10, 100K workers, 100 producers | 9,973,951 (best) | 2,802,805 | 2,263,989 | 2,053,640 | 2,757,581 | 2,245,171 | 2,303,811 | 2,861,536 | 800,109 | L194–202 |
| Loop10, 100K workers, 1K producers | 9,616,461 (best) | 2,783,820 | 2,068,040 | 2,203,184 | 2,772,634 | 3,084,433 | 2,330,652 | 2,577,287 | 864,647 | L203–211 |
| Loop10, 100K workers, 10K producers | 9,303,365 (best) | 2,589,295 | 1,830,866 | 2,072,131 | 3,119,879 | 3,140,786 | 2,473,921 | 2,379,015 | 779,417 | L212–220 |
| Loop10, 100K workers, 1M producers | 5,040,936 (best) | 2,505,392 | 1,257,497 | 1,406,473 | 3,846,960 | 2,014,759 | 1,925,627 | 1,909,667 | 284,459 | L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer | 3,734,297 (best) | 2,077,719 | 679,474 | 1,589,036 | 2,883,425 | 1,921,903 | 2,052,352 | 1,916,682 | 730,519 | L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers | 4,111,318 (best) | 2,482,053 | 1,532,271 | 1,642,233 | 2,685,430 | 1,829,144 | 1,801,063 | 2,497,989 | 778,669 | L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers | 4,163,080 (best) | 2,373,647 | 1,716,568 | 1,634,549 | 2,682,940 | 1,680,077 | 1,870,507 | 2,661,241 | 753,595 | L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers | 3,983,207 (best) | 2,149,628 | 1,530,045 | 1,438,901 | 2,702,715 | 1,612,935 | 1,919,240 | 2,789,687 | 684,114 | L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers | 2,757,349 | 1,805,562 | 1,225,296 | 1,382,658 | 2,879,461 (best) | 1,545,701 | 1,560,507 | 1,560,923 | 630,118 | L266–274 |
| Sleep10ms, 300K workers, 1 producer | 2,455,963 | 2,093,774 | 576,738 | 1,213,314 | 2,784,449 (best) | 1,855,333 | 1,547,576 | 1,621,264 | 722,264 | L275–283 |
| Sleep10ms, 300K workers, 100 producers | 2,719,832 (best) | 2,306,727 | 1,484,983 | 1,251,695 | 2,617,496 | 1,759,026 | 1,476,386 | 1,688,833 | 942,273 | L284–292 |
| Sleep10ms, 300K workers, 1K producers | 2,726,497 (best) | 2,213,675 | 1,633,217 | 1,302,743 | 2,680,243 | 1,628,227 | 1,468,225 | 1,746,018 | 709,496 | L293–301 |
| Sleep10ms, 300K workers, 10K producers | 2,766,179 | 2,002,153 | 1,477,399 | 1,318,660 | 2,815,102 (best) | 1,632,026 | 1,519,349 | 1,715,160 | 675,031 | L302–310 |
| Sleep10ms, 300K workers, 1M producers | 2,660,367 | 1,747,875 | 1,173,250 | 1,153,433 | 2,669,081 (best) | 748,295 | 1,326,906 | 1,325,233 | 320,406 | L311–319 |
| Loop10, 300K workers, 1 producer | 7,731,116 (best) | 3,256,171 | 1,115,385 | 1,383,162 | 3,147,900 | 2,043,314 | 1,752,500 | 2,041,223 | 885,063 | L320–328 |
| Loop10, 300K workers, 100 producers | 9,990,429 (best) | 2,788,718 | 2,115,681 | 1,566,953 | 2,884,260 | 2,312,304 | 1,802,248 | 1,927,430 | 815,860 | L329–337 |
| Loop10, 300K workers, 1K producers | 9,748,598 (best) | 2,723,620 | 2,071,194 | 1,612,649 | 2,961,010 | 3,133,647 | 1,722,204 | 1,898,363 | 938,049 | L338–346 |
| Loop10, 300K workers, 10K producers | 9,514,309 (best) | 2,597,026 | 1,988,261 | 1,593,171 | 3,787,789 | 3,325,401 | 1,565,705 | 1,829,661 | 547,704 | L347–355 |
| Loop10, 300K workers, 1M producers | 5,112,507 (best) | 2,515,607 | 1,297,076 | 1,326,960 | 3,819,515 | 2,005,256 | 1,572,745 | 1,643,865 | 183,942 | L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer | 2,459,278 | 2,248,233 | 882,246 | 1,211,796 | 2,997,183 (best) | 1,896,457 | 1,575,617 | 1,717,074 | 763,774 | L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers | 2,742,270 (best) | 2,438,900 | 1,539,005 | 1,261,448 | 2,634,212 | 1,799,708 | 1,481,643 | 1,777,802 | 802,117 | L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers | 2,804,855 (best) | 2,384,087 | 1,682,370 | 1,293,508 | 2,709,618 | 1,660,992 | 1,507,317 | 1,703,386 | 769,307 | L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers | 2,989,275 (best) | 2,164,418 | 1,508,185 | 1,320,203 | 2,773,516 | 1,647,167 | 1,517,762 | 1,799,994 | 673,978 | L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers | 2,482,123 | 1,834,465 | 1,222,747 | 1,214,876 | 3,068,841 (best) | 1,070,799 | 1,357,213 | 1,351,918 | 357,014 | L401–409 |
| Loop10, 1 worker, 1 producer | 6,326,035 | 1,708,634 | 1,477,781 | 4,029,748 | 2,505,977 | 11,383,821 | 3,830,596 | 26,148,651 (best) | 2,783,170 | L410–418 |
| Loop10, 1 worker, 100 producers | 7,090,918 | 1,829,284 | 1,257,569 | 2,485,982 | 983,882 | 4,734,976 | 2,661,374 | 27,854,937 (best) | 1,580,776 | L419–427 |
| Loop10, 1 worker, 1K producers | 7,190,233 | 1,164,781 | 950,948 | 1,991,543 | 1,976,966 | 4,724,164 | 3,535,456 | 26,084,154 (best) | 1,564,245 | L428–436 |
| Loop10, 1 worker, 10K producers | 7,177,970 | 1,587,642 | 1,608,207 | 1,347,437 | 826,160 | 4,376,133 | 2,947,091 | 24,737,062 (best) | 1,568,077 | L437–445 |
| Loop10, 1 worker, 1M producers | 5,181,886 | 802,451 | 1,151,548 | 1,323,368 | 1,266,037 | 3,965,171 | 2,352,358 | 5,320,750 (best) | 1,283,997 | L446–454 |
| Loop10K, 1 worker, 1 producer | 322,978 | 262,550 | 150,606 | 206,440 | 264,605 | 336,341 | 220,928 | 337,903 (best) | 299,628 | L455–463 |
| Loop10K, 1 worker, 100 producers | 326,262 | 263,467 | 173,781 | 307,338 | 268,565 | 314,035 | 320,871 | 334,568 (best) | 278,476 | L464–472 |
| Loop10K, 1 worker, 1K producers | 325,224 | 263,508 | 152,058 | 302,173 | 262,424 | 316,598 | 321,028 | 336,500 (best) | 277,681 | L473–481 |
| Loop10K, 1 worker, 10K producers | 325,199 | 256,045 | 202,793 | 296,590 | 255,972 | 318,011 | 313,400 | 337,132 (best) | 271,426 | L482–490 |
| Loop10K, 1 worker, 1M producers | 324,508 | 268,194 | 192,389 | 284,650 | 241,213 | 322,427 | 295,566 | 328,842 (best) | 260,446 | L491–499 |
Run detailsgo test command, machine, versions
cd pool && go test -run xxx -bench 'Tasks' -cpu 8 -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
| Library | Version |
|---|---|
| varmq | v1.10.0 |
| ants | v2.12.1 |
| workerpool | v1.2.2 |
| conc | v0.3.0 |
| x/sync (errgroup) | v0.24.0 |
| bytedance/gopkg (gopool) | v0.1.4 |
| pond | v2.7.2 |
Worker pool, GOMAXPROCS 4
The same matrix with GOMAXPROCS 4.
55 groups in scope · VarMQ leads 19, others 36 · 9 subjects
Tasks per second
tasks/s · higher is better · mean of 55 groups- VarMQwon 19 of 55 4,037,474 1.00 times VarMQ, the baseline
- BufferedPool †won 21 of 55 3,942,859 0.98 times VarMQ, behind VarMQ
- Gopoolwon 0 of 55 2,281,205 0.57 times VarMQ, behind VarMQ
- ErrGroupwon 11 of 55 2,210,498 0.55 times VarMQ, behind VarMQ
- Antswon 4 of 55 2,055,044 0.51 times VarMQ, behind VarMQ
- GoroutinePool †won 0 of 55 1,908,708 0.47 times VarMQ, behind VarMQ
- Concwon 0 of 55 1,558,666 0.39 times VarMQ, behind VarMQ
- WorkerPoolwon 0 of 55 1,395,833 0.35 times VarMQ, behind VarMQ
- Pondwon 0 of 55 773,266 0.19 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
† A baseline, not a library: N goroutines reading one channel. The buffered one holds all 1M tasks.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| Task · workers | 1 producer | 100 producers | 1K producers | 10K producers | 1M producers |
|---|---|---|---|---|---|
| Sleep10ms · 50K | |||||
| Loop10 · 50K | |||||
| Sleep5msLoop5 · 50K | |||||
| Sleep10ms · 100K | |||||
| Loop10 · 100K | |||||
| Sleep5msLoop5 · 100K | |||||
| Sleep10ms · 300K | |||||
| Loop10 · 300K | |||||
| Sleep5msLoop5 · 300K | |||||
| Loop10 · 1 worker | |||||
| Loop10K · 1 worker |
- VQVarMQ19
- BPBufferedPool †21
- EGErrGroup11
- ANAnts4
Where VarMQ does not win
Another subject has the fastest throughput in 36 groups of 55. VarMQ has it in 19.
- BufferedPool † 21 groups
- ErrGroup 11 groups
- Ants 4 groups
All 36 groups where VarMQ does not win, biggest gap first
| Group | Best | VarMQ | Ahead by | Source |
|---|---|---|---|---|
| Loop10, 1 worker, 1 producer | BufferedPool † 26,202,379 | 6,632,332 3 of 9 | 3.95× | L410–418 |
| Loop10, 1 worker, 100 producers | BufferedPool † 27,380,238 | 7,308,651 2 of 9 | 3.75× | L419–427 |
| Loop10, 1 worker, 1K producers | BufferedPool † 26,829,003 | 7,342,679 2 of 9 | 3.65× | L428–436 |
| Loop10, 1 worker, 10K producers | BufferedPool † 23,643,298 | 7,271,060 2 of 9 | 3.25× | L437–445 |
| Sleep10ms, 50K workers, 1 producer | BufferedPool † 3,736,757 | 2,504,306 2 of 9 | 1.49× | L5–13 |
| Sleep10ms, 50K workers, 1K producers | BufferedPool † 3,674,940 | 2,481,416 2 of 9 | 1.48× | L23–31 |
| Sleep10ms, 50K workers, 10K producers | BufferedPool † 3,662,015 | 2,491,621 2 of 9 | 1.47× | L32–40 |
| Sleep10ms, 50K workers, 100 producers | BufferedPool † 3,673,447 | 2,554,864 2 of 9 | 1.44× | L14–22 |
| Sleep10ms, 100K workers, 1M producers | ErrGroup 1,967,247 | 1,373,342 6 of 9 | 1.43× | L176–184 |
| Sleep10ms, 300K workers, 1M producers | ErrGroup 1,951,801 | 1,392,523 4 of 9 | 1.40× | L311–319 |
| Sleep5msLoop5, 300K workers, 1M producers | ErrGroup 2,107,373 | 1,521,728 4 of 9 | 1.38× | L401–409 |
| Sleep10ms, 50K workers, 1M producers | ErrGroup 1,968,705 | 1,436,960 6 of 9 | 1.37× | L41–49 |
| Sleep5msLoop5, 100K workers, 1M producers | ErrGroup 2,040,959 | 1,491,073 4 of 9 | 1.37× | L266–274 |
| Sleep5msLoop5, 50K workers, 1M producers | ErrGroup 2,047,829 | 1,499,597 6 of 9 | 1.37× | L131–139 |
| Sleep5msLoop5, 300K workers, 1 producer | ErrGroup 2,540,219 | 2,180,862 3 of 9 | 1.16× | L365–373 |
| Sleep5msLoop5, 50K workers, 100 producers | BufferedPool † 3,332,321 | 2,873,030 2 of 9 | 1.16× | L104–112 |
| Sleep10ms, 300K workers, 1 producer | ErrGroup 2,282,556 | 1,972,243 3 of 9 | 1.16× | L275–283 |
| Sleep5msLoop5, 50K workers, 10K producers | BufferedPool † 3,185,706 | 2,771,238 2 of 9 | 1.15× | L122–130 |
| Sleep10ms, 300K workers, 100 producers | Ants 2,132,405 | 1,900,906 3 of 9 | 1.12× | L284–292 |
| Loop10, 1 worker, 1M producers | BufferedPool † 4,798,241 | 4,304,050 2 of 9 | 1.11× | L446–454 |
| Sleep5msLoop5, 300K workers, 1K producers | Ants 2,338,347 | 2,136,678 2 of 9 | 1.09× | L383–391 |
| Sleep5msLoop5, 50K workers, 1K producers | BufferedPool † 3,101,827 | 2,860,632 2 of 9 | 1.08× | L113–121 |
| Sleep10ms, 300K workers, 1K producers | Ants 2,212,462 | 2,070,837 2 of 9 | 1.07× | L293–301 |
| Sleep10ms, 100K workers, 100 producers | BufferedPool † 2,572,532 | 2,423,256 2 of 9 | 1.06× | L149–157 |
| Loop10K, 1 worker, 1 producer | BufferedPool † 333,826 | 324,401 3 of 9 | 1.03× | L455–463 |
| Loop10K, 1 worker, 1K producers | BufferedPool † 334,843 | 325,729 2 of 9 | 1.03× | L473–481 |
| Loop10K, 1 worker, 1M producers | BufferedPool † 333,400 | 325,027 3 of 9 | 1.03× | L491–499 |
| Sleep10ms, 100K workers, 1K producers | BufferedPool † 2,526,768 | 2,464,268 2 of 9 | 1.03× | L158–166 |
| Loop10K, 1 worker, 100 producers | BufferedPool † 332,585 | 324,909 2 of 9 | 1.02× | L464–472 |
| Loop10K, 1 worker, 10K producers | BufferedPool † 333,216 | 325,666 2 of 9 | 1.02× | L482–490 |
| Sleep10ms, 100K workers, 1 producer | ErrGroup 2,326,813 | 2,277,277 2 of 9 | 1.02× | L140–148 |
| Sleep5msLoop5, 100K workers, 1K producers | BufferedPool † 2,737,841 | 2,685,087 2 of 9 | 1.02× | L248–256 |
| Sleep5msLoop5, 300K workers, 100 producers | Ants 2,276,359 | 2,261,985 2 of 9 | 1.01× | L374–382 |
| Sleep10ms, 100K workers, 10K producers | BufferedPool † 2,439,078 | 2,423,984 2 of 9 | 1.01× | L167–175 |
| Sleep10ms, 300K workers, 10K producers | ErrGroup 2,115,244 | 2,108,599 2 of 9 | 1.00× | L302–310 |
| Sleep5msLoop5, 300K workers, 10K producers | ErrGroup 2,226,923 | 2,220,232 2 of 9 | 1.00× | L392–400 |
Every row behind these numbers · 55 groups
| Group | VarMQ | Ants | WorkerPool | Conc | ErrGroup | Gopool | GoroutinePool † | BufferedPool † | Pond | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| Sleep10ms, 50K workers, 1 producer | 2,504,306 | 1,913,216 | 1,183,121 | 1,883,293 | 2,253,850 | 2,215,600 | 2,024,379 | 3,736,757 (best) | 623,183 | L5–13 |
| Sleep10ms, 50K workers, 100 producers | 2,554,864 | 2,177,404 | 1,619,490 | 1,725,821 | 2,110,137 | 2,021,565 | 1,921,155 | 3,673,447 (best) | 654,648 | L14–22 |
| Sleep10ms, 50K workers, 1K producers | 2,481,416 | 2,237,604 | 1,591,348 | 1,644,058 | 2,066,129 | 1,712,781 | 1,915,121 | 3,674,940 (best) | 664,580 | L23–31 |
| Sleep10ms, 50K workers, 10K producers | 2,491,621 | 1,920,782 | 1,452,288 | 1,454,461 | 1,913,117 | 2,175,690 | 2,113,921 | 3,662,015 (best) | 750,254 | L32–40 |
| Sleep10ms, 50K workers, 1M producers | 1,436,960 | 1,517,066 | 1,042,072 | 1,398,267 | 1,968,705 (best) | 1,883,409 | 1,510,171 | 1,544,148 | 653,792 | L41–49 |
| Loop10, 50K workers, 1 producer | 8,974,684 (best) | 3,663,215 | 1,557,553 | 2,427,842 | 3,588,268 | 2,604,365 | 2,880,121 | 2,932,268 | 854,865 | L50–58 |
| Loop10, 50K workers, 100 producers | 9,414,707 (best) | 2,909,906 | 2,280,660 | 2,440,272 | 2,610,244 | 2,293,829 | 2,663,600 | 4,692,294 | 882,400 | L59–67 |
| Loop10, 50K workers, 1K producers | 9,242,992 (best) | 2,884,879 | 2,111,816 | 2,562,457 | 2,723,893 | 2,553,615 | 2,954,328 | 3,428,164 | 821,661 | L68–76 |
| Loop10, 50K workers, 10K producers | 9,100,058 (best) | 2,713,562 | 1,927,611 | 2,772,204 | 3,016,296 | 2,652,457 | 3,405,348 | 3,249,114 | 766,849 | L77–85 |
| Loop10, 50K workers, 1M producers | 4,078,666 (best) | 2,728,615 | 1,365,879 | 1,726,126 | 3,757,427 | 2,399,119 | 2,076,888 | 2,168,784 | 707,310 | L86–94 |
| Sleep5msLoop5, 50K workers, 1 producer | 2,683,120 (best) | 2,188,831 | 1,397,144 | 1,827,467 | 2,548,192 | 2,230,850 | 1,993,757 | 2,020,323 | 703,813 | L95–103 |
| Sleep5msLoop5, 50K workers, 100 producers | 2,873,030 | 2,365,318 | 1,601,606 | 1,628,028 | 2,082,071 | 1,916,477 | 1,803,299 | 3,332,321 (best) | 724,189 | L104–112 |
| Sleep5msLoop5, 50K workers, 1K producers | 2,860,632 | 2,316,929 | 1,595,246 | 1,677,868 | 2,129,081 | 1,529,943 | 1,871,692 | 3,101,827 (best) | 750,682 | L113–121 |
| Sleep5msLoop5, 50K workers, 10K producers | 2,771,238 | 1,979,868 | 1,393,430 | 1,437,549 | 2,034,452 | 2,113,058 | 2,032,782 | 3,185,706 (best) | 792,167 | L122–130 |
| Sleep5msLoop5, 50K workers, 1M producers | 1,499,597 | 1,631,679 | 1,029,438 | 1,386,109 | 2,047,829 (best) | 1,957,175 | 1,543,432 | 1,542,083 | 649,209 | L131–139 |
| Sleep10ms, 100K workers, 1 producer | 2,277,277 | 1,929,536 | 1,344,598 | 1,635,295 | 2,326,813 (best) | 2,213,291 | 1,752,724 | 1,778,211 | 621,073 | L140–148 |
| Sleep10ms, 100K workers, 100 producers | 2,423,256 | 2,235,957 | 1,544,855 | 1,439,483 | 1,902,991 | 2,016,200 | 1,538,496 | 2,572,532 (best) | 676,464 | L149–157 |
| Sleep10ms, 100K workers, 1K producers | 2,464,268 | 2,161,787 | 1,573,492 | 1,526,274 | 1,990,995 | 1,593,568 | 1,629,140 | 2,526,768 (best) | 667,401 | L158–166 |
| Sleep10ms, 100K workers, 10K producers | 2,423,984 | 1,901,625 | 1,393,122 | 1,427,641 | 2,150,416 | 1,599,449 | 1,757,459 | 2,439,078 (best) | 813,016 | L167–175 |
| Sleep10ms, 100K workers, 1M producers | 1,373,342 | 1,482,758 | 1,004,084 | 1,289,624 | 1,967,247 (best) | 1,870,184 | 1,414,272 | 1,411,968 | 591,249 | L176–184 |
| Loop10, 100K workers, 1 producer | 8,822,850 (best) | 3,695,054 | 999,547 | 2,203,406 | 3,614,516 | 2,526,563 | 2,594,506 | 2,748,426 | 887,493 | L185–193 |
| Loop10, 100K workers, 100 producers | 9,073,531 (best) | 2,850,110 | 2,254,006 | 2,176,856 | 2,595,711 | 2,334,207 | 2,352,562 | 2,934,572 | 889,293 | L194–202 |
| Loop10, 100K workers, 1K producers | 8,963,968 (best) | 2,823,795 | 2,092,593 | 2,162,966 | 2,860,459 | 2,605,763 | 2,411,816 | 2,778,263 | 819,885 | L203–211 |
| Loop10, 100K workers, 10K producers | 8,741,077 (best) | 2,712,149 | 1,878,664 | 2,321,116 | 3,242,404 | 2,619,015 | 2,967,802 | 2,785,151 | 769,006 | L212–220 |
| Loop10, 100K workers, 1M producers | 4,085,856 (best) | 2,712,580 | 1,367,833 | 1,491,690 | 3,796,375 | 2,379,867 | 1,962,092 | 2,047,578 | 445,405 | L221–229 |
| Sleep5msLoop5, 100K workers, 1 producer | 2,588,982 (best) | 2,177,372 | 1,266,818 | 1,678,743 | 2,534,752 | 2,282,109 | 1,830,325 | 1,874,953 | 713,349 | L230–238 |
| Sleep5msLoop5, 100K workers, 100 producers | 2,675,082 (best) | 2,369,545 | 1,615,656 | 1,476,984 | 1,919,244 | 1,911,984 | 1,558,296 | 2,363,042 | 731,775 | L239–247 |
| Sleep5msLoop5, 100K workers, 1K producers | 2,685,087 | 2,325,682 | 1,589,778 | 1,586,390 | 2,003,671 | 1,785,487 | 1,631,038 | 2,737,841 (best) | 698,138 | L248–256 |
| Sleep5msLoop5, 100K workers, 10K producers | 2,612,762 (best) | 1,962,630 | 1,441,348 | 1,462,821 | 2,156,860 | 1,675,246 | 1,804,550 | 2,345,062 | 842,579 | L257–265 |
| Sleep5msLoop5, 100K workers, 1M producers | 1,491,073 | 1,672,673 | 1,036,474 | 1,342,939 | 2,040,959 (best) | 1,947,089 | 1,410,187 | 1,459,386 | 578,672 | L266–274 |
| Sleep10ms, 300K workers, 1 producer | 1,972,243 | 1,895,103 | 1,400,181 | 1,259,592 | 2,282,556 (best) | 2,114,410 | 1,449,094 | 1,528,653 | 619,592 | L275–283 |
| Sleep10ms, 300K workers, 100 producers | 1,900,906 | 2,132,405 (best) | 1,549,604 | 1,165,948 | 1,843,322 | 1,816,248 | 1,295,588 | 2,019,173 | 681,027 | L284–292 |
| Sleep10ms, 300K workers, 1K producers | 2,070,837 | 2,212,462 (best) | 1,531,333 | 1,222,419 | 1,940,576 | 1,344,606 | 1,309,023 | 1,682,078 | 728,195 | L293–301 |
| Sleep10ms, 300K workers, 10K producers | 2,108,599 | 1,899,876 | 1,378,367 | 1,262,676 | 2,115,244 (best) | 1,526,651 | 1,455,983 | 1,683,873 | 609,106 | L302–310 |
| Sleep10ms, 300K workers, 1M producers | 1,392,523 | 1,483,417 | 1,017,560 | 1,082,728 | 1,951,801 (best) | 1,875,449 | 1,210,427 | 1,254,215 | 400,028 | L311–319 |
| Loop10, 300K workers, 1 producer | 8,904,451 (best) | 3,691,593 | 876,263 | 1,587,828 | 3,559,990 | 2,486,249 | 2,030,857 | 2,167,295 | 880,499 | L320–328 |
| Loop10, 300K workers, 100 producers | 9,540,875 (best) | 2,884,675 | 2,303,545 | 1,512,610 | 2,725,520 | 2,314,553 | 1,763,438 | 2,057,987 | 877,699 | L329–337 |
| Loop10, 300K workers, 1K producers | 8,864,308 (best) | 2,880,763 | 2,139,906 | 1,525,242 | 2,817,087 | 2,411,791 | 1,891,427 | 1,864,496 | 821,228 | L338–346 |
| Loop10, 300K workers, 10K producers | 8,823,550 (best) | 2,649,041 | 1,937,796 | 1,600,822 | 3,558,489 | 2,536,054 | 1,900,095 | 1,914,892 | 772,312 | L347–355 |
| Loop10, 300K workers, 1M producers | 4,006,494 (best) | 2,774,204 | 1,380,812 | 1,501,498 | 3,906,769 | 2,394,671 | 1,659,267 | 1,691,046 | 404,836 | L356–364 |
| Sleep5msLoop5, 300K workers, 1 producer | 2,180,862 | 2,158,372 | 1,469,828 | 1,300,435 | 2,540,219 (best) | 2,267,699 | 1,485,305 | 1,568,345 | 697,295 | L365–373 |
| Sleep5msLoop5, 300K workers, 100 producers | 2,261,985 | 2,276,359 (best) | 1,601,331 | 1,169,340 | 1,899,621 | 1,968,919 | 1,286,994 | 1,614,006 | 727,407 | L374–382 |
| Sleep5msLoop5, 300K workers, 1K producers | 2,136,678 | 2,338,347 (best) | 1,562,446 | 1,195,559 | 1,985,445 | 1,721,649 | 1,337,528 | 1,588,406 | 700,550 | L383–391 |
| Sleep5msLoop5, 300K workers, 10K producers | 2,220,232 | 1,939,939 | 1,425,925 | 1,234,456 | 2,226,923 (best) | 1,448,610 | 1,441,574 | 1,684,125 | 637,865 | L392–400 |
| Sleep5msLoop5, 300K workers, 1M producers | 1,521,728 | 1,645,270 | 1,037,657 | 1,156,707 | 2,107,373 (best) | 1,896,843 | 1,204,219 | 1,270,588 | 372,732 | L401–409 |
| Loop10, 1 worker, 1 producer | 6,632,332 | 1,242,226 | 1,769,691 | 2,090,601 | 1,341,601 | 11,813,021 | 3,692,385 | 26,202,379 (best) | 2,773,548 | L410–418 |
| Loop10, 1 worker, 100 producers | 7,308,651 | 1,696,633 | 1,712,354 | 3,028,265 | 2,482,547 | 4,781,570 | 5,785,343 | 27,380,238 (best) | 1,733,181 | L419–427 |
| Loop10, 1 worker, 1K producers | 7,342,679 | 1,461,392 | 1,494,450 | 2,709,995 | 2,371,571 | 4,789,004 | 3,910,772 | 26,829,003 (best) | 1,686,809 | L428–436 |
| Loop10, 1 worker, 10K producers | 7,271,060 | 1,402,085 | 1,337,644 | 2,115,881 | 1,302,625 | 4,927,431 | 3,558,888 | 23,643,298 (best) | 1,705,779 | L437–445 |
| Loop10, 1 worker, 1M producers | 4,304,050 | 895,593 | 1,349,366 | 1,352,913 | 1,366,016 | 3,808,882 | 2,519,020 | 4,798,241 (best) | 1,530,277 | L446–454 |
| Loop10K, 1 worker, 1 producer | 324,401 | 262,078 | 179,912 | 217,314 | 268,953 | 330,298 | 205,916 | 333,826 (best) | 300,071 | L455–463 |
| Loop10K, 1 worker, 100 producers | 324,909 | 265,614 | 186,457 | 317,155 | 262,930 | 318,468 | 322,479 | 332,585 (best) | 282,164 | L464–472 |
| Loop10K, 1 worker, 1K producers | 325,729 | 263,156 | 161,846 | 313,304 | 264,692 | 310,645 | 321,535 | 334,843 (best) | 280,022 | L473–481 |
| Loop10K, 1 worker, 10K producers | 325,666 | 253,377 | 228,233 | 305,421 | 252,112 | 312,945 | 311,607 | 333,216 (best) | 280,109 | L482–490 |
| Loop10K, 1 worker, 1M producers | 325,027 | 261,287 | 186,733 | 283,844 | 250,315 | 329,648 | 304,900 | 333,400 (best) | 282,891 | L491–499 |
Run detailsgo test command, machine, versions
cd pool && go test -run xxx -bench 'Tasks' -cpu 4 -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
| Library | Version |
|---|---|
| varmq | v1.10.0 |
| ants | v2.12.1 |
| workerpool | v1.2.2 |
| conc | v0.3.0 |
| x/sync (errgroup) | v0.24.0 |
| bytedance/gopkg (gopool) | v0.1.4 |
| pond | v2.7.2 |
Message queues on Redis
Six subjects from five libraries on Redis 7.2.
12 groups of 24 in scope · VarMQ leads 4, others 8 · 6 subjects
Jobs per second
jobs/s · higher is better · mean of 12 groups- VarMQwon 4 of 12 33,005 1.00 times VarMQ, the baseline
- VarMQDistributedwon 0 of 12 31,044 0.94 times VarMQ, behind VarMQ
- GocraftWorkwon 1 of 12 29,200 0.88 times VarMQ, behind VarMQ
- Rmqwon 7 of 12 26,476 0.80 times VarMQ, behind VarMQ
- Taskqwon 0 of 12 20,835 0.63 times VarMQ, behind VarMQ
- Asynqwon 0 of 12 14,804 0.45 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| Task · workers · instances | 1 producer | 100 producers |
|---|---|---|
| Noop · 10 · C1 | ||
| Noop · 100 · C1 | ||
| Noop · 1000 · C1 | ||
| Sleep1ms · 10 · C1 | ||
| Sleep1ms · 100 · C1 | ||
| Sleep1ms · 1000 · C1 |
- VQVarMQ4
- RMRmq7
- GWGocraftWork1
Where VarMQ does not win
Another subject has the fastest throughput in 8 groups of 12. VarMQ has it in 4.
- Rmq 7 groups
- GocraftWork 1 group
All 8 groups where VarMQ does not win, biggest gap first
| Group | Best | VarMQ | Ahead by | Source |
|---|---|---|---|---|
| Noop, 100 workers, C1, 1 producer | Rmq 35,708 | VarMQDistributed 21,426 3 of 6 | 1.67× | L27–32 |
| Noop, 1000 workers, C1, 1 producer | Rmq 34,621 | VarMQDistributed 21,425 3 of 6 | 1.62× | L49–54 |
| Noop, 10 workers, C1, 1 producer | Rmq 35,129 | 21,968 3 of 6 | 1.60× | L5–10 |
| Sleep 1 ms, 100 workers, C1, 1 producer | Rmq 28,837 | VarMQDistributed 21,177 3 of 6 | 1.36× | L93–98 |
| Sleep 1 ms, 1000 workers, C1, 1 producer | Rmq 28,898 | 21,243 3 of 6 | 1.36× | L115–120 |
| Sleep 1 ms, 10 workers, C1, 100 producers | Rmq 6,314 | 5,077 4 of 6 | 1.24× | L77–82 |
| Sleep 1 ms, 10 workers, C1, 1 producer | Rmq 7,032 | 5,695 4 of 6 | 1.23× | L71–76 |
| Noop, 10 workers, C1, 100 producers | GocraftWork 48,917 | 41,816 2 of 6 | 1.17× | L11–16 |
Every row behind these numbers · 12 groups
| Group | VarMQ | Asynq | VarMQDistributed | Rmq | Taskq | GocraftWork | Source |
|---|---|---|---|---|---|---|---|
| Noop, 10 workers, C1, 1 producer | 21,968 | 15,806 | 21,664 | 35,129 (best) | 19,031 | 25,428 | L5–10 |
| Noop, 10 workers, C1, 100 producers | 41,816 | 17,823 | 38,909 | 29,616 | 34,434 | 48,917 (best) | L11–16 |
| Noop, 100 workers, C1, 1 producer | 20,812 | 15,096 | 21,426 | 35,708 (best) | 18,448 | 25,731 | L27–32 |
| Noop, 100 workers, C1, 100 producers | 59,898 (best) | 17,744 | 54,031 | 28,521 | 34,499 | 44,775 | L33–38 |
| Noop, 1000 workers, C1, 1 producer | 21,157 | 17,710 | 21,425 | 34,621 (best) | 16,351 | 25,147 | L49–54 |
| Noop, 1000 workers, C1, 100 producers | 58,308 (best) | 18,954 | 54,007 | 30,010 | 27,197 | 40,255 | L55–60 |
| Sleep 1 ms, 10 workers, C1, 1 producer | 5,695 | 5,332 | 5,514 | 7,032 (best) | 5,745 | 6,144 | L71–76 |
| Sleep 1 ms, 10 workers, C1, 100 producers | 5,077 | 4,907 | 4,866 | 6,314 (best) | 5,227 | 5,528 | L77–82 |
| Sleep 1 ms, 100 workers, C1, 1 producer | 21,017 | 14,703 | 21,177 | 28,837 (best) | 18,810 | 25,093 | L93–98 |
| Sleep 1 ms, 100 workers, C1, 100 producers | 45,894 (best) | 17,315 | 42,158 | 26,208 | 27,743 | 44,324 | L99–104 |
| Sleep 1 ms, 1000 workers, C1, 1 producer | 21,243 | 16,264 | 21,197 | 28,898 (best) | 16,517 | 22,712 | L115–120 |
| Sleep 1 ms, 1000 workers, C1, 100 producers | 73,175 (best) | 15,998 | 66,152 | 26,821 | 26,015 | 36,343 | L121–126 |
Run detailsgo test command, machine, versions
task redis:upcd redis && go test -run xxx -bench 'Durable/^(Noop|Sleep1ms)W\d+C1$' -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
Message queues on SQLite
Five subjects from four libraries, WAL checkpoint at 1000 and 10000 pages.
8 groups in scope · VarMQ leads 8, others 0 · 5 subjects
Jobs per second
jobs/s · higher is better · mean of 8 groups- VarMQwon 8 of 8 28,628 1.00 times VarMQ, the baseline
- Goqitewon 0 of 8 4,064 0.14 times VarMQ, behind VarMQ
- Riverwon 0 of 8 2,614 0.09 times VarMQ, behind VarMQ
The dashed line marks VarMQ. An amber ratio means the lane is ahead of it. The “×” column divides the lane by VarMQ.
Not in the lanes: Backlite (6 of 8 groups), VarMQSingleFile (2 of 8 groups). A mean over unequal groups would not compare like with like. Narrow the filters to see them.
Who leads each group
one square = one group of rowsA filled green square: a VarMQ subject leads the group. An outlined amber square: another subject leads, and its code is in the square. A dashed square with “=”: a VarMQ subject and another subject share the best value, so neither leads. Press a square to see that group in the lanes above.
| Scenario | 1000 pages | 10000 pages |
|---|---|---|
| Mixed1Q | ||
| Drain1Q | ||
| DrainPrio | ||
| Mixed10Q |
- VQVarMQ8
Where VarMQ does not win
VarMQ has the fastest throughput in every one of the 8 groups in this scope.
Every row behind these numbers · 8 groups
| Group | VarMQ | Goqite | Backlite | River | VarMQSingleFile | Source |
|---|---|---|---|---|---|---|
| Mixed1Q, 1000 pages | 8,575 (best) | 3,032 | 924 | 1,375 | not run | L5–8 |
| Mixed1Q, 10000 pages | 11,860 (best) | 7,091 | 294 | 2,115 | not run | L9–12 |
| Drain1Q, 1000 pages | 14,725 (best) | 2,933 | 1,119 | 3,230 | not run | L13–16 |
| Drain1Q, 10000 pages | 21,225 (best) | 4,921 | 1,016 | 3,719 | not run | L17–20 |
| DrainPrio, 1000 pages | 12,937 (best) | 2,908 | not run | 3,240 | not run | L21–23 |
| DrainPrio, 10000 pages | 25,608 (best) | 4,828 | not run | 3,625 | not run | L24–26 |
| Mixed10Q, 1000 pages | 29,624 (best) | 2,131 | 5,326 | 1,431 | 4,553 | L27–31 |
| Mixed10Q, 10000 pages | 104,471 (best) | 4,668 | 5,419 | 2,175 | 14,110 | L32–36 |
Run detailsgo test command, machine, versions
cd sqlite && go test -run xxx -bench 'SQLite' -benchtime=2x -benchmem -timeout 0The command runs the groups in scope on your machine, from a clone of the benchmarks repository.
Intel Core i7-13700 (24 threads), linux/amd64, Go 1.26, SQLite databases on ext4 over NVMe.
The pool suite sets GOMAXPROCS to 24, 8 and 4 with no core pinning. The SQLite suite runs on all 24 threads. Redis 7.2 (Debian image) is pinned to CPU 14 and the Redis suite's client to CPUs 0-13 and 16-23 (22 threads), so Redis has a whole physical core.
CPU line of the raw file: 13th Gen Intel(R) Core(TM) i7-13700. Copied from the benchmarks README and the header of each raw file.
| Library | Version |
|---|---|
| varmq | v1.10.0 |
| sqliteq | v0.3.0 |
| goqite | v0.4.0 |
| backlite | v0.8.0 |
| River with its SQLite driver | v0.49.0 |
| go-sqlite3 | v1.14.28 |
How to read the numbers
Section titled “How to read the numbers”- A row is one line of output. A group is the rows that run one case with different subjects, for example
Sleep10mswith 50K workers and one producer. A subject leads a group when its row is the best one. When a VarMQ subject and another subject share the best value, the group is tied: it counts for neither side, and the map marks it with “=”. - Two iterations per row. The files use
-benchtime=2x, so each row covers two iterations, with no warm-up iteration. Absolute numbers change from run to run, so compare ratios inside one run. - A lane is a mean. When several groups are in scope, a lane is the arithmetic mean of that subject over them. A subject that misses some of the groups is left out, because its mean would cover other rows. Narrow the filters to see it.
- MB means 10^6 bytes. Memory is the
B/opcolumn divided by one million. The charts at benchmarks.goptics.org divide by 2^20 and still print MB, so their memory figures are 4.6 % smaller. - Pool memory covers the whole process. It counts every allocation during a run of 1M tasks. VarMQ’s
Addnever blocks, so waiting tasks sit in an unbounded queue and use memory. - † marks a baseline.
GoroutinePoolandBufferedPoolare N goroutines that read one channel. They are not libraries. Switch them off with the Baselines control. - Redis has two VarMQ subjects.
VarMQruns with one instance.VarMQDistributedruns with one and with four. Where VarMQ does not run, the × column divides byVarMQDistributed. The charts leaveVarMQDistributedout of the one-instance, enqueue and latency groups. This page keeps it, because it is in the raw file. - Latency is enqueue to handler. One job at a time, 1,000 jobs, 10 workers, one instance. Lower is better.
For the full method of each suite, read the READMEs in the benchmarks repository: pool, Redis and SQLite.
Where the data comes from
Section titled “Where the data comes from”The page reads a committed snapshot, src/components/bench/data.json. A script builds it from the raw .txt files at one commit of the benchmarks repository. The script keeps the line number of every row, which is how the page links each figure to its line. The docs build does not use the network.
The live charts at benchmarks.goptics.org do not send a CORS header. A browser on this site cannot read their dataset, so the page cannot refresh itself. To update the snapshot, run these commands in the docs/ folder:
node scripts/bench-data.mjs --ref main --check-livepnpm test--check-live compares every row with the published chart data and fails on a difference. The tests check the figures against the home page and check that each go test command selects exactly the groups in scope.
Run it yourself
Section titled “Run it yourself”Install Go 1.26 or later and Task, then clone goptics/benchmarks. The Redis suite needs Docker. The SQLite suite needs a C compiler.
task pool:bench # one iteration of every pool benchmarktask redis:up redis:bench redis:downtask sqlite:benchRun details, at the foot of the explorer, shows the command for the groups in scope. The full run takes hours: the committed pool files took 1282 s, 917 s and 904 s.
See also the comparison of features and the bench log.
VarMQ is MIT licensed. Benchmark figures come from github.com/goptics/benchmarks.