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 }