1 module app;
2 
3 import mempooled.fixed;
4 
5 import std.datetime.stopwatch;
6 import std.stdio;
7 
8 struct Foo
9 {
10     long[4] f;
11     ~this() nothrow @nogc {}
12 }
13 
14 static assert(Foo.sizeof == 32);
15 enum NUM_ALLOC = 10_000_000;
16 
17 void main()
18 {
19     alias PFoo = Foo*;
20     PFoo[][] pf;
21     pf = new PFoo[][3];
22     foreach (i; 0..3) pf[i] = new PFoo[NUM_ALLOC];
23 
24     auto pool = fixedPool!(Foo, NUM_ALLOC)();
25 
26     auto res = benchmark!(
27         {
28             auto p = pool;
29             foreach (i; 0..NUM_ALLOC)
30             {
31                 pf[0][i] = p.alloc();
32             }
33         },
34         {
35             foreach (i; 0..NUM_ALLOC)
36             {
37                 pf[1][i] = cast(Foo*)(new Foo());
38             }
39         },
40         {
41             import core.stdc.stdlib : malloc;
42             import std.conv : emplace;
43             foreach (i; 0..NUM_ALLOC)
44             {
45                 pf[2][i] = (cast(Foo*)malloc(Foo.sizeof)).emplace;
46             }
47         },
48     )(1);
49 
50     writeln("Alloc");
51     writeln("-----");
52     writeln("fixedPool: ", res[0]);
53     writeln("GC:        ", res[1]);
54     writeln("malloc:    ", res[2]);
55 
56     res = benchmark!(
57         {
58             auto p = pool;
59             foreach (i; 0..NUM_ALLOC)
60             {
61                 p.dealloc(pf[0][i]);
62             }
63         },
64         {
65             foreach (i; 0..NUM_ALLOC)
66             {
67                 destroy(*pf[1][i]);
68             }
69         },
70         {
71             import core.stdc.stdlib : free;
72             foreach (i; 0..NUM_ALLOC)
73             {
74                 free(pf[2][i]);
75             }
76         },
77     )(1);
78 
79     writeln();
80     writeln("Dealloc");
81     writeln("-------");
82     writeln("fixedPool: ", res[0]);
83     writeln("GC:        ", res[1]);
84     writeln("malloc:    ", res[2]);
85 }