On Sat, 23 Jun 2012 17:30:01 +0200, Michael <[email protected]> wrote:
Hello!
I have a little question about templates. I am trying to write a
template "timer" that takes a function and times how long the function
takes to execute. Something like
auto time = timer!sort(array);
is equivalent to
auto start = Clock.currStdTime();
sort(array);
auto time = Clock.currStdTime() - time;
except of course that the variable "start" is not created in the former
case.
The closest I came to the correct template is
template(alias F) timer {
auto timer {
auto start = Clock.currStdTime();
F();
return Clock.currStdTime() - time;
}
}
The problem with the template is I cannot pass any argument into "F".
How should I fix this problem?
Also, I am not entirely sure why I need to write "alias F" instead of
just "F", any explanation would be appreciated.
Thank you guys,
Michael
import std.datetime;
import std.traits;
import std.stdio;
struct TimerResult(T) {
TickDuration duration;
T result;
}
auto timer(alias fn, Args...)(Args args) {
auto sw = StopWatch(AutoStart.yes);
auto res = fn(args);
return TimerResult!(typeof(res))(sw.peek, res);
}
T f(T)(T[] arr) {
import core.thread;
Thread.sleep(dur!"seconds"(1));
return arr[0];
}
void main() {
auto res = timer!f([1,2,3,4]);
writeln("first elem: ", res.result);
writeln("time used: ", res.duration.msecs);
}