x64 Ubuntu : Intel® Q6600® quad-core |
Each chart bar shows how many times more Time or how many times more Memory one unidentified ↓ thread-ring program used, compared to the program that used least Time or the program that used least Memory.
This table shows 5 measurements - CPU Time, Elapsed Time, Memory, Code and ~ CPU Load.
Compare how much Memory the thread-ring programs used - sort Memory KB. Compare how much Code the programs used - sort Code B
Column × shows how many times more each program used compared to the program that used least.
| sort | sort | sort | sort | |||
|---|---|---|---|---|---|---|
| × | Program Source Code | CPU secs | Elapsed secs | Memory KB | Code B | ~ CPU Load |
| 1.0 | Haskell GHC #3 | 9.05 | 9.06 | 3,208 | 274 | 0% 0% 100% 0% |
| 2.3 | Go 6g 8g #3 | 20.61 | 20.61 | 3,272 | 347 | 0% 100% 0% 0% |
| 2.3 | Go 6g 8g | 20.62 | 20.62 | 3,284 | 309 | 0% 0% 100% 0% |
| 2.8 | C GNU gcc #3 | 25.65 | 25.65 | 17,032 | 607 | 0% 0% 100% 0% |
| 3.1 | Smalltalk VisualWorks #2 | 28.07 | 28.07 | 23,924 | 566 | 0% 0% 0% 100% |
| 3.5 | Erlang HiPE | 31.78 | 31.78 | 10,152 | 273 | 0% 5% 95% 0% |
| 3.5 | Java 6 -server #4 | 30.75 | 31.98 | 293,408 | 894 | 32% 27% 17% 18% |
| 11 | Scheme PLT | 103.01 | 103.01 | 31,744 | 262 | 0% 100% 0% 0% |
| 13 | Pascal Free Pascal | 121.31 | 122.26 | 4,744 | 523 | 23% 44% 9% 15% |
| 14 | Scala | 151.86 | 128.21 | 223,632 | 339 | 29% 35% 28% 23% |
| 16 | C GNU gcc #2 | 142.29 | 144.58 | 2,704 | 575 | 24% 10% 24% 35% |
| 16 | ATS | 144.83 | 146.83 | 4,780 | 1090 | 8% 39% 13% 36% |
| 19 | C GNU gcc | 167.65 | 173.76 | 4,704 | 487 | 33% 7% 0% 53% |
| 20 | C++ GNU g++ #2 | 170.77 | 177.19 | 5,352 | 588 | 56% 6% 6% 27% |
| 20 | OCaml #3 | 178.81 | 180.82 | 5,296 | 296 | 2% 16% 48% 30% |
| 21 | OCaml #2 | 188.35 | 187.85 | 7,300 | 350 | 31% 16% 37% 7% |
| 23 | C++ GNU g++ | 249.64 | 206.82 | 5,384 | 636 | 28% 34% 30% 19% |
| 24 | Lisp SBCL | 217.68 | 214.65 | 68,216 | 618 | 3% 31% 57% 6% |
| 25 | Python CPython #2 | 225.39 | 225.89 | 8,244 | 287 | 47% 3% 12% 34% |
| 29 | Lisp SBCL #2 | 285.63 | 266.13 | 68,388 | 571 | 36% 16% 13% 37% |
| 34 | Java 6 -server #3 | 5 min | 5 min | 364,220 | 530 | 6% 2% 29% 59% |
| 36 | Ada 2005 GNAT #2 | 6 min | 5 min | 9,840 | 560 | 36% 30% 28% 20% |
| 44 | Go 6g 8g #2 | 7 min | 6 min | 3,344 | 333 | 23% 42% 7% 30% |
| 44 | Ada 2005 GNAT | 9 min | 6 min | 9,772 | 602 | 40% 29% 35% 26% |
| 49 | C# Mono | 13 min | 7 min | 13,404 | 476 | 46% 38% 35% 39% |
| 50 | Java 6 -Xint #3 | 7 min | 7 min | 53,480 | 530 | 16% 53% 0% 28% |
| 56 | Ruby JRuby | 8 min | 8 min | 92,992 | 342 | 7% 44% 49% 1% |
| 57 | Perl #3 | 9 min | 8 min | 842,364 | 489 | 35% 20% 30% 16% |
| 57 | Ruby JRuby #2 | 13 min | 8 min | 84,944 | 228 | 22% 58% 36% 23% |
| 71 | F# Mono | 18 min | 10 min | 15,284 | 472 | 30% 41% 46% 45% |
| 80 | OCaml | 12 min | 12 min | 8,488 | 282 | 20% 33% 32% 12% |
| 114 | Java 6 -Xint #4 | 16 min | 17 min | 96,884 | 894 | 36% 33% 13% 10% |
| 198 | Ruby MRI #2 | 29 min | 29 min | 14,580 | 228 | 100% 0% 0% 0% |
| 252 | Perl | 48 min | 38 min | 280,424 | 353 | 46% 40% 17% 10% |
| 340 | Ruby MRI | 51 min | 51 min | 14,168 | 342 | 1% 100% 1% 1% |
| interesting alternative programs | ||||||
| 0.2 | Java 6 -server #6 | 1.44 | 1.41 | 266,276 | 543 | |
| 0.6 | Java 6 -server #2 | 5.10 | 5.13 | 77,376 | 693 | |
| 1.6 | Lua #3 | 14.23 | 14.23 | 1,644 | 264 | |
| 1.7 | Lua | 15.12 | 15.12 | 1,736 | 255 | |
| 1.7 | Python CPython #3 | 15.45 | 15.46 | 4,008 | 272 | |
| 1.7 | Java 6 -server #5 | 15.21 | 15.74 | 165,620 | 432 | |
| 1.8 | Lua #2 | 16.02 | 16.02 | 1,672 | 284 | |
| missing programs | ||||||
| Clean | No program | |||||
| Fortran Intel | No program | |||||
| Java 6 steady state | No program | |||||
| JavaScript TraceMonkey | No program | |||||
| JavaScript V8 | No program | |||||
| Lua | No program | |||||
| PHP | No program | |||||
diff program output N = 1000 with this output file to check your program is correct before contributing.
Each program should create and keep alive 503 threads, explicity or implicitly linked in a ring, and pass a token between one thread and the next thread at least N times.
Each program should
Similar benchmarks are described in Performance Measurements of Threads in Java and Processes in Erlang, 1998; and A Benchmark Test for BCPL Style Coroutines, 2004. For some language implementations increasing the number of threads quickly results in Death by Concurrency.
Programs may use kernel threads, lightweight threads; but coroutines, cooperative threads and other programs with custom schedulers will be listed as interesting alternative implementations. Briefly say what concurrency technique is used in the program header comment.