]> git.llucax.com Git - software/dgc/dgcbench.git/blob - micro/conalloc.d
Update micro benchmarks
[software/dgc/dgcbench.git] / micro / conalloc.d
1 // Written by Leandro Lucarella
2 //
3 // The goal of this program is to do very CPU intensive work in threads
4
5 import tango.core.Thread: Thread;
6 import tango.core.sync.Atomic: atomicStore, atomicLoad, atomicAdd;
7 import tango.io.device.File: File;
8 import tango.util.digest.Sha512: Sha512;
9 import tango.util.Convert: to;
10
11 auto N = 100;
12 auto NT = 2;
13 ubyte[] BYTES;
14 int running; // Atomic
15
16 void main(char[][] args)
17 {
18         auto fname = args[0];
19         if (args.length > 3)
20                 fname = args[3];
21         if (args.length > 2)
22                 NT = to!(int)(args[2]);
23         if (args.length > 1)
24                 N = to!(int)(args[1]);
25         N /= NT;
26         atomicStore(running, NT);
27         BYTES = cast(ubyte[]) File.get(fname);
28         auto threads = new Thread[NT];
29         foreach(ref thread; threads) {
30                 thread = new Thread(&doSha);
31                 thread.start();
32         }
33         while (atomicLoad(running)) {
34                 auto a = new void[](BYTES.length / 4);
35                 a[] = cast(void[]) BYTES[];
36                 Thread.yield();
37         }
38         foreach(thread; threads)
39                 thread.join();
40 }
41
42 void doSha()
43 {
44         for (size_t i = 0; i < N; i++) {
45                 auto sha = new Sha512;
46                 sha.update(BYTES);
47         }
48         atomicAdd(running, -1);
49 }
50