]> git.llucax.com Git - software/dgc/dgcbench.git/blob - micro/multicore.d
Add multicore contention micro benchmark
[software/dgc/dgcbench.git] / micro / multicore.d
1 // Written by David Schima:
2 // http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=103563
3 //
4 // Modified by Leandro Lucarella:
5 // * Removed initial "pause"
6 // * Removed performance counter
7 // * Adapted to D1/Tango
8 //
9 // Compiled with: -O -inline -release
10 //
11 // Timing with affinity for all 4 CPUs:  28390 milliseconds
12 // Timing with affinity for only 1 CPU:  533 milliseconds
13 //
14 // More about contention killing multi-core:
15 //
16 // import std.stdio, std.perf, core.thread;
17 //
18 // void main() {
19 //    writeln("Set affinity, then press enter.");
20 //    readln();
21 //
22 //    auto pc = new PerformanceCounter;
23 //    pc.start;
24 //
25 //    enum nThreads = 4;
26 //    auto threads = new Thread[nThreads];
27 //    foreach(ref thread; threads) {
28 //        thread = new Thread(&doStuff);
29 //        thread.start();
30 //    }
31 //
32 //    foreach(thread; threads) {
33 //        thread.join();
34 //    }
35 //
36 //    pc.stop;
37 //    writeln(pc.milliseconds);
38 // }
39 //
40 // void doStuff() {
41 //     foreach(i; 0..1_000_000) {
42 //        synchronized {}
43 //     }
44 // }
45 //
46 // Timing with affinity for all CPUs:  20772 ms.
47 // Timing with affinity for 1 CPU:  156 ms.
48 //
49 // Post on using spin locks in the GC to avoid contention:
50 // http://www.digitalmars.com/d/archives/digitalmars/D/More_on_GC_Spinlocks_80485.html
51
52 import tango.core.Thread;
53
54 void main() {
55         enum { nThreads = 4 };
56         auto threads = new Thread[nThreads];
57         foreach(ref thread; threads) {
58                 thread = new Thread(&doAppending);
59                 thread.start();
60         }
61
62         foreach(thread; threads)
63                 thread.join();
64 }
65
66 void doAppending() {
67         uint[] arr;
68         for (size_t i = 0; i < 1_000_000; i++)
69                 arr ~= i;
70 }
71