x64 Ubuntu : Intel® Q6600® one 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 | 6.10 | 6.10 | 2,944 | 274 | 0% 0% 0% 100% |
| 1.2 | Erlang HiPE | 7.54 | 7.54 | 9,068 | 273 | 99% 0% 1% 1% |
| 3.4 | Go 6g 8g | 20.58 | 20.58 | 3,284 | 309 | 0% 0% 0% 100% |
| 3.4 | Go 6g 8g #3 | 20.59 | 20.59 | 3,272 | 347 | 0% 0% 0% 100% |
| 4.0 | Java 6 -server #4 | 24.37 | 24.40 | 289,972 | 894 | 0% 0% 0% 100% |
| 4.3 | C GNU gcc #3 | 26.22 | 26.22 | 17,032 | 607 | 0% 0% 0% 100% |
| 4.6 | Smalltalk VisualWorks #2 | 27.93 | 27.93 | 23,928 | 566 | 0% 0% 0% 100% |
| 14 | Pascal Free Pascal | 86.33 | 86.33 | 4,744 | 523 | 0% 0% 0% 100% |
| 17 | C GNU gcc #2 | 101.45 | 101.45 | 2,708 | 575 | 0% 1% 0% 100% |
| 17 | Scheme PLT | 104.62 | 104.62 | 31,712 | 262 | 0% 0% 0% 100% |
| 17 | C GNU gcc | 105.37 | 105.36 | 4,704 | 487 | 0% 0% 0% 100% |
| 18 | ATS | 109.94 | 109.93 | 4,788 | 1090 | 0% 0% 0% 100% |
| 18 | C++ GNU g++ #2 | 111.60 | 111.60 | 5,356 | 588 | 0% 0% 0% 100% |
| 20 | Scala | 124.24 | 124.37 | 396,404 | 339 | 0% 0% 0% 100% |
| 22 | OCaml #2 | 135.84 | 135.83 | 7,300 | 350 | 0% 0% 0% 100% |
| 23 | Go 6g 8g #2 | 139.69 | 139.69 | 3,380 | 333 | 0% 0% 0% 100% |
| 24 | OCaml #3 | 145.53 | 145.52 | 5,296 | 296 | 0% 0% 0% 100% |
| 27 | C++ GNU g++ | 166.28 | 166.27 | 5,380 | 636 | 0% 0% 0% 100% |
| 28 | Python CPython #2 | 173.11 | 173.10 | 8,236 | 287 | 0% 0% 0% 100% |
| 34 | Lisp SBCL #2 | 204.70 | 204.68 | 68,392 | 571 | 0% 0% 0% 100% |
| 36 | Java 6 -server #3 | 218.72 | 218.73 | 349,520 | 530 | 0% 0% 0% 100% |
| 43 | C# Mono | 262.39 | 262.38 | 13,176 | 476 | 0% 0% 0% 100% |
| 43 | Ada 2005 GNAT #2 | 264.85 | 264.85 | 9,836 | 560 | 0% 0% 0% 100% |
| 50 | Ada 2005 GNAT | 5 min | 5 min | 9,768 | 602 | 0% 0% 0% 100% |
| 52 | Java 6 -Xint #3 | 5 min | 5 min | 53,472 | 530 | 0% 0% 0% 100% |
| 61 | Ruby JRuby | 6 min | 6 min | 104,804 | 342 | 0% 0% 0% 100% |
| 65 | F# Mono | 6 min | 6 min | 15,128 | 472 | 0% 1% 0% 100% |
| 66 | OCaml | 6 min | 6 min | 8,504 | 282 | 0% 0% 0% 100% |
| 81 | Ruby JRuby #2 | 8 min | 8 min | 91,748 | 228 | 0% 0% 0% 100% |
| 82 | Perl #3 | 8 min | 8 min | 842,292 | 489 | 0% 0% 0% 100% |
| 140 | Java 6 -Xint #4 | 14 min | 14 min | 96,812 | 894 | 0% 0% 0% 100% |
| 240 | Perl | 24 min | 24 min | 278,296 | 353 | 0% 0% 0% 100% |
| 293 | Ruby MRI #2 | 29 min | 29 min | 14,760 | 228 | 0% 0% 0% 100% |
| 506 | Ruby MRI | 51 min | 51 min | 13,984 | 342 | 0% 0% 0% 100% |
| Lisp SBCL | Timed Out | 1h 00 min | 618 | |||
| interesting alternative programs | ||||||
| 0.2 | Java 6 -server #6 | 1.34 | 1.48 | 216,348 | 543 | |
| 0.9 | Java 6 -server #2 | 5.20 | 5.21 | 35,428 | 693 | |
| 2.1 | Java 6 -server #5 | 12.48 | 12.53 | 166,356 | 432 | |
| 2.3 | Lua #3 | 14.16 | 14.17 | 1,644 | 264 | |
| 2.5 | Lua | 15.07 | 15.07 | 1,736 | 255 | |
| 2.5 | Python CPython #3 | 15.46 | 15.47 | 4,008 | 272 | |
| 2.6 | Lua #2 | 15.82 | 15.82 | 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.