1 /** 2 Copyright: Copyright (c) 2018, Joakim Brännström. All rights reserved. 3 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) 4 Author: Joakim Brännström (joakim.brannstrom@gmx.com) 5 */ 6 module datacat_test.common; 7 8 import core.time : Duration; 9 import logger = std.experimental.logger; 10 11 immutable ResultFileExt = ".csv"; 12 13 struct BenchResult { 14 string name; 15 Duration total; 16 Duration lowest = Duration.max; 17 18 this(string name) { 19 this.name = name; 20 } 21 22 ~this() { 23 import std.file : exists; 24 import std.stdio : File; 25 26 auto fname = name ~ ResultFileExt; 27 28 try { 29 if (!exists(fname)) 30 File(fname, "w").writeln(`"lowest(usec)","total(usec)"`); 31 File(fname, "a").writefln(`"%s","%s"`, lowest.total!"usecs", total.total!"usecs"); 32 } catch (Exception e) { 33 logger.error(e.msg); 34 } 35 } 36 37 string toString() { 38 import std.format : format; 39 40 return format(`lowest(%s) total(%s)`, lowest, total); 41 } 42 } 43 44 auto benchmark(alias fn)(int times, string func = __FUNCTION__) { 45 import std.datetime.stopwatch : StopWatch; 46 import std.typecons : Yes, RefCounted; 47 import std.stdio; 48 49 auto res = RefCounted!BenchResult(func); 50 foreach (const i; 0 .. times) { 51 auto sw = StopWatch(Yes.autoStart); 52 auto fnres = fn(); 53 sw.stop; 54 if (sw.peek < res.lowest) 55 res.lowest = sw.peek; 56 res.total += sw.peek; 57 } 58 59 return res; 60 }